Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript正则表达式组目标_Javascript_Regex - Fatal编程技术网

JavaScript正则表达式组目标

JavaScript正则表达式组目标,javascript,regex,Javascript,Regex,我需要捕获一些标准字符串中的单词(实际上是链接id),但不是捕获所有字符串 这个 使用ruby,并以color\u form\u submit\u yellow 但在JS中,它似乎捕获了所有字符串,我不明白为什么。您需要明确查找与第一个捕获组的匹配: var myregexp = /color_form_submit_(\w+)/; var match = myregexp.exec(subject); if (match != null) { result = match[1]; }

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

这个

使用ruby,并以
color\u form\u submit\u yellow


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

您需要明确查找与第一个捕获组的匹配:

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

不幸的是,JS不支持lookbehinds,failed
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())
这将是javascript中最短的()方法

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

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

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];

显示您的代码、生成的内容以及您期望的内容。
'color\u form\u submit\u yellow'。匹配(/color\u form\u submit\u(\w+)/)[1]
@Jack:如果不匹配?@thg435,则会出现一个大错误。@Jack:不,您会遇到错误。我的代码可以很好地工作。是的,我知道我可以做到,但我想用一个正则表达式来实现它(只是为了优雅)@JoeHalfFace:对不起,不。其他正则表达式允许
(?@JoeHalfFace这只是一个正则表达式,不是吗?对不起,但这不是“最短的”。@thg435最短的”可读性版本:-p从性能角度来看,调用数组构造函数只是为了从中弹出一个不存在的值,只是为了保存一行,这是一个很好的选择。我不知道你是否曾经在一个大型项目中工作过,但如果只有一行代码以一种更明显的方式做同样的事情,你的同事肯定会因为这段代码而杀了你。可能是。尽管如此,将此解决方案称为“最短”是不正确的。这不是关于“保存一行”。@Paul和我的解决方案可以在表达式上下文中使用,即在函数调用中,您的-不是。@thg435编辑了我的答案以给您评分。^但恭喜,您差点赢得高尔夫比赛;)@我只是发布了我的答案,因为我没有先正确阅读你的答案。它现在被删除了,但是如果你很高兴它再次出现,我不介意按undelete^^+1,没有看到这个。您也可以使用
[1]
而不是
.pop()
,这是我在(现在已删除)答案中所做的。@Jack它未删除;见;-)
('fail'.match(reg) || [])[1]; // undefined
[1, 2, 3] || []; // [1, 2, 3]
null      || []; // []
array[1] === (array)[1];