我需要捕捉一些标准字符串中的单词(实际上是链接 id),但不是捕捉所有字符串。
这
(?:color_form_submit_)(\w+)
在红宝石yellow
中工作并捕获color_form_submit_yellow
但是在 JS 中它似乎捕获了所有字符串,我不知道为什么。
我需要捕捉一些标准字符串中的单词(实际上是链接 id),但不是捕捉所有字符串。
这
(?:color_form_submit_)(\w+)
在红宝石yellow
中工作并捕获color_form_submit_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 不支持lookbehinds 并且失败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 中获得的最短(不必要的混淆)方式。