已弃用的Javascript RegExp属性的替代方案

时间:2017-07-16 03:29:33

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

我指的是MDN Documentation for Javascript here

它表示不推荐使用以下RegExp属性:

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

为什么他们会被弃用? Aren他们都有用吗?有什么新的替代品,如果有的话?

具体来说,文件说:

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

这听起来不自相矛盾吗?

1 个答案:

答案 0 :(得分:3)

它们已被弃用,因为它是一个难以正确使用并泄漏信息的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')