我要做的是提取匹配的模式,但其中一个模式可以是可选的。让我们直接举例。
我想要匹配的目标文字是,
<foo>\n<bar>\n#####<foo>\n#####<bar>
我的正则表达式是,
/(#{5})?/
(我使用的原因是什么?这是因为特定的模式可以是可选的。例如,我不希望匹配完全是一个错过,而不仅仅是这个模式的'undefined'。< / em>的)
我期望str.match()返回的是
[ '#####',
'#####',
index: 12,
input: '<foo>\n<bar>\n#####<foo>\n#####<bar>' ]
但实际上是,
[ '',
undefined,
index: 0,
input: '<foo>\n<bar>\n#####<foo>\n#####<bar>' ]
如果我使用以下模式,它将正常工作。
/(#{5})+/
为什么?
我在nodejs / chrome和IE中尝试了这个,但是没有一个工作,这意味着这个行为在JS引擎中是一致的。但它的行为与我尝试过的许多工具之一的行为方式不同regexpal。我不确定这是工具本身的问题还是只是不同的实现。
答案 0 :(得分:1)
var re = /(#{5})/;
console.log ("<foo>\n<bar>\n#####<foo>\n#####<bar>".match (re));
console.log ("<foo>\n<bar>\nfoo>\n<bar>".match (re));
输出:
[ '#####',
'#####',
index: 12,
input: '<foo>\n<bar>\n#####<foo>\n#####<bar>' ]
null
如果它是可选的,则当没有匹配时正则表达式失败,如果失败则返回null。
> /a/.exec("a")
[ 'a', index: 0, input: 'a' ]
> /a/.exec("b")
null
> "a".match(/a/)
[ 'a', index: 0, input: 'a' ]
> "b".match(/a/)
null
另外,不要使用String#match(),它比RegExp#exec()慢,并且都返回相同的内容: