3

我要做的是提取匹配模式,但其中一种模式可能是可选的。我们直接上例子。

我要匹配的目标文本是,

<foo>\n<bar>\n#####<foo>\n#####<bar>

我的正则表达式是,

/(#{5})?/

我在这里使用 ? 的原因是因为特定的模式可能是可选的。例如,我不希望匹配完全错过,而不仅仅是这个模式的“未定义”。

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

4

1 回答 1

0
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() 慢,并且返回相同:

匹配()与执行()

于 2012-11-12T09:11:27.140 回答