JavaScript中的正则表达式,如果使用分组后跟问号,则始终为“未定义”

时间:2012-11-12 07:32:08

标签: javascript regex node.js

我要做的是提取匹配的模式,但其中一个模式可以是可选的。让我们直接举例。

我想要匹配的目标文字是,

<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。我不确定这是工具本身的问题还是只是不同的实现。

1 个答案:

答案 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()慢,并且都返回相同的内容:

match() vs exec()