具有可选组包装多个组的正则表达式对于未采用的分支返回undefined

时间:2015-04-15 18:25:02

标签: javascript regex

我试图在JavaScript中编写一个正则表达式,它返回字符串中没有引号(如果存在)的第一个带引号或未带引号的单词。例如:

'"quoted phrase" followed by text' => 'quoted phrase'
'phrase without quotes followed by text' => 'phrase'

我的正则表达式目前是:(?:"([^"]*)"|([^"\s]+))

然而,我注意到的是输出总是包含两个匹配组,一个总是未定义的,可能来自未被采用的分支(即它是' s如果第一个单词没有引用,则第一个匹配,否则为第二个单词。

我可以进行哪些更改以避免获取undefined匹配组并仍然获得引用剥离行为?

注意:单词不是严格的"仅限单词" (例如字母数字)字符。它们可以包含非单词字符,而不是"字符。

3 个答案:

答案 0 :(得分:1)

您需要使用^(开始主播)来匹配第一个单词,只需使用\w+来匹配单词,我认为您不需要主要群组:

"([^"]*)"|(^\w+)

Demo

答案 1 :(得分:1)

由于您在正则表达式中定义了嵌套分组,因此您将获得额外匹配。纠正的表达应该是 (?:"[^"]*"|[^"\s]+)会为您的输入生成以下内容(不带字符串引号)

'"quoted phrase" followed by text' => "quoted phrase"
'phrase without quotes followed by text' => phrase

答案 2 :(得分:1)

只使用正则表达式,你无法做你想做的事。其他正则表达式风格具有功能特性,如分支重置组(使每个分支中的捕获组以相同的数字开头):

(?|"([^"]*)"|([^"\s]+))

...或者他们允许您为多个组使用相同的名称:

(?:"(?<token>[^"]*)"|(?<token>[^"\s]+))

...但JavaScript没有任何内容。在与编程语言(Perl,Python,Java等)相关的所有正则表达式中,JavaScript是最缺乏有用的功能。您只需浏览所有群组,找到不属于undefined的群组。