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

Alternatives for deprecated Javascript RegExp properties

我指的是MDN Documentation for Javascript here.

它表示以下 RegExp 属性已弃用:

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

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

具体来说,文档说:

"The following properties are deprecated. This does not affect their use in replacement strings."

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

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

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

那是一个非常丑陋的 API。

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

matchPrivateKey();
var private = RegExp.;

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

使用像

这样的API会更好
var re = /([0-9])([0-9])([0-9])/;
var [, three, four, five] = "345".match(re);

其中 .match returns 包含匹配结果的数组。

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

"The following properties are deprecated. This does not affect their use in replacement strings."

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

完全没有。 RegExp 上的属性已弃用,但是 "345".replace(/3([0-9])5/, '') 仍然完全可以找到,因为字符串模式与构造函数 属性.

无关