【问题标题】:Alternatives for deprecated Javascript RegExp properties [duplicate]已弃用的 Javascript RegExp 属性的替代方案 [重复]
【发布时间】:2017-07-16 03:29:32
【问题描述】:

我指的是MDN Documentation for Javascript here

它说以下 RegExp 属性已被弃用:

$1-$9
$_
$*
$&
$+
$`
$'
input
lastMatch   
lastParen   
leftContext 
rightContext    

为什么它们被弃用了?它们不都是有用的属性吗?如果有的话,新的替代品是什么?

具体来说,文档说:

“不推荐使用以下属性。这不会影响它们在替换字符串中的使用。”

这听起来是不是自相矛盾?

【问题讨论】:

  • 您希望将它们用于什么?知道用什么代替会更有用,但不知道自己在做什么就很难说。
  • 问题在于它们是全局(静态)属性,是从正则表达式实例上的方法调用分配的。这包括泄漏信息、在意外时间更改值以及通常导致错误行为和不可读代码。

标签: javascript regex ecmascript-6 deprecated regex-group


【解决方案1】:

它们已被弃用,因为它是一种难以正确使用且会泄露信息的 API。当您对正则表达式进行匹配时,通常您希望匹配函数返回一个值,或者至少在 RegExp 实例本身上进行跟踪。需要明确的是,这些是RegExp 的属性,而不是实例 的属性。举个例子:

var re = /([0-9])([0-9])([0-9])/;
re.test("345");
var three = RegExp.$1;
var four = RegExp.$2;
var five = RegExp.$3;

这是一个非常丑陋的 API。

它不仅难以使用,而且意味着如果您正在编写一个库,则可以访问您 API 的内部状态。此示例中还有其他危险,但请考虑以下情况:

matchPrivateKey();
var private = RegExp.$1;

如果在 matchSecretKey 内部您使用了正则表达式来匹配某个私钥,那么它现在可以在您的模块外部访问并泄露给页面上运行的其他代码。

使用类似的 API 会好很多

var re = /([0-9])([0-9])([0-9])/;
var [, three, four, five] = "345".match(re);

其中.match 返回一个包含匹配结果的数组。

您永远不会期望对象实例改变构造函数的属性。

“不推荐使用以下属性。这不会影响它们在替换字符串中的使用。”

这听起来是不是自相矛盾?

一点也不。 RegExp 上的属性已被弃用,但由于字符串模式与构造函数属性无关,因此仍然完全可以找到 "345".replace(/3([0-9])5/, '$1')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    相关资源
    最近更新 更多