我试图在JavaScript中编写一个正则表达式,它返回字符串中没有引号(如果存在)的第一个带引号或未带引号的单词。例如:
'"quoted phrase" followed by text' => 'quoted phrase'
'phrase without quotes followed by text' => 'phrase'
我的正则表达式目前是:(?:"([^"]*)"|([^"\s]+))
然而,我注意到的是输出总是包含两个匹配组,一个总是未定义的,可能来自未被采用的分支(即它是' s如果第一个单词没有引用,则第一个匹配,否则为第二个单词。
我可以进行哪些更改以避免获取undefined
匹配组并仍然获得引用剥离行为?
注意:单词不是严格的"仅限单词" (例如字母数字)字符。它们可以包含非单词字符,而不是"
字符。
答案 0 :(得分:1)
答案 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
的群组。