为什么此RegEx与数字不匹配,仅与字符匹配?

时间:2016-12-22 13:46:05

标签: regex

我正在构建一个基于RegEx的Markdown解析器。在使用RegEx查找参考样式的链接标签时,我遇到了一个我的RegEx中的一个错误,我无法看到问题。

鉴于以下Markdown:

[me]: http://example.com
[her]: http://somewhere.com
[1]: http://nhs.net
[2]: http://test.com
[google it]: http://google.com

这个RegEX:

\[(\w+\s?+\w+)\]

我似乎只能检测[我],[她]和[谷歌]但不能检测标签[1]和[2]。我以为\w应该检测字母和数字字符?

编辑:使用PCRE RegEx解析器

2 个答案:

答案 0 :(得分:3)

由于两个\w+\s?+\w+子模式,\w+模式至少匹配2个字符。

如果要匹配可选的以空格分隔的单词,请使用

\[(\w+(?:\s+\w+)*)\]
      ^^^^^^^^^^^

请参阅regex demo

<强>详情:

  • \[ - 开场[
  • (\w+(?:\s+\w+)*) - 第1组:
    • \w+ - 1 + word chars
    • (?:\s+\w+)* - 零个或多个序列:
      • \s+ - 一个或多个空格(如果您使用?,则会出现1次或0次匹配)
      • \w+ - 1 + word chars
  • ] - 结束](不需要转义)

替代正则表达式 - 如果您需要确保[]后跟/前面加上字词char,请使用

\[\b([^\][]+)\b]

\[\b与字词char之前的[匹配,([^\][]+)捕获除[]以及\b]之外的1个字符匹配单词char之后的]。 请参阅regex demo

答案 1 :(得分:0)

你的正则表达式与这两个数字不匹配,因为你希望1 +个字符带有\w+,而另外1+个字符带有\w+。所以至少有2个字符

此外,您的\s?+很奇怪。这意味着您需要一个可选的空格,但需要一次或多次。