为什么这个正则表达式不能匹配数字,只匹配字符?

4

我正在构建一个基于正则表达式的Markdown解析器。在编写用于查找引用样式链接标签的正则表达式时,我遇到了一个问题,但我无法找到问题所在。

给定以下Markdown:

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

还有这个正则表达式:

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

我似乎只能检测到[me]、[her]和[google it]这些标签,而不能检测到[1]和[2]这些标签。我认为\w应该可以检测到字母和数字字符吗?

编辑:使用PCRE正则表达式解析器


你能否告诉我你正在使用的正则表达式引擎是哪种:ICU、PCRE还是JS?还有其他的吗? - Wiktor Stribiżew
已更新为PCRE状态。 - Garry Pettet
1
好的,那么在我的另一种建议中,您可以省略]之前的\[^][]在PCRE中匹配除[]之外的任何字符。 - Wiktor Stribiżew
2个回答

3
\w+\s*\w+ pattern instead. This pattern matches one or more word characters separated by zero or more whitespace characters.
\[(\w+(?:\s+\w+)*)\]
      ^^^^^^^^^^^

请查看正则表达式演示

细节:

  • \[ - 一个开放的 [
  • (\w+(?:\s+\w+)*) - 第一组:
    • \w+ - 1个或多个单词字符
    • (?:\s+\w+)* - 零个或多个序列:
      • \s+ - 1个或多个空格(如果使用?,则匹配1个或0个出现次数)
      • \w+ - 1个或多个单词字符
  • ] - 一个关闭的 ] (不需要转义)

另一个正则表达式 - 如果您需要确保[]前后跟随一个单词字符,请使用

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

\[\b匹配一个单词字符前的[([^\][]+)捕获除了[]之外的1个或多个字符,并且\b]匹配一个单词字符后面的]。 请参考正则表达式演示


1
太好了。非常感谢您提供的模式,更感谢您的解释。正则表达式非常强大,但是模式很难理解! - Garry Pettet

0

你的正则表达式与这两个数字不匹配,因为你期望使用 \w+ 匹配 1 个或多个字符,并使用第二个 \w+ 匹配另外 1 个或多个字符。所以至少需要 2 个字符。

此外,你的 \s?+ 很奇怪。这意味着你想要一个可选的空格,但是至少出现一次或更多次。


你对 \s?+ 的描述很奇怪,它要么是一个占有性的可选空格,要么就是语法错误。 - Sebastian Proske

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接