JavaScript 正则表达式组定位

JavaScript regex group targeting

本文关键字:定位 正则表达式 JavaScript      更新时间:2023-09-26

我需要捕获一些标准字符串中的单词(实际上是链接ID(,但不是捕获所有字符串。

(?:color_form_submit_)('w+)

用红宝石工作,在color_form_submit_yellow中捕捉yellow

但是在JS中它似乎捕获了所有字符串,我不知道为什么。

我想实现一个正则表达式只是为了优雅

如果你想要优雅,那么你可以尝试这样的东西

var str = 'color_form_submit_yellow',
    reg = /color_form_submit_('w+)/;
(str.match(reg) || [])[1]; // "yellow"

你也有

('fail'.match(reg) || [])[1]; // undefined

这是有效的,因为

[1, 2, 3] || []; // [1, 2, 3]
null      || []; // []
array[1] === (array)[1];

不幸的是,JS不支持回溯和失败match返回null,而不是空数组。因此,在没有if条件的情况下,在一个表达式中做到这一点的唯一方法是类似

color = (str.match(/color_form_submit_('w+)/) || []).pop()

例:

> ("color_form_submit_black".match(/color_form_submit_('w+)/) || []).pop()
"black"
> ("foo bar".match(/color_form_submit_('w+)/) || []).pop()
undefined

if 语句相比,此构造的优点是它可以在表达式上下文中使用,例如,在函数调用中:

 myRegex = /color_form_submit_('w+)/
 showColor((myLabel.match(myRegex) || []).pop())

您需要显式查找与第一个捕获组的匹配项:

var myregexp = /color_form_submit_('w+)/;
var match = myregexp.exec(subject);
if (match != null) {
    result = match[1];
}
var match = string.match(/color_form_submit_('w+)/);
match && match[1];

将是你在 JavaScript 中可以获得的最短(不必要的混淆(方式。