【问题标题】:Regex does not match the whole string正则表达式不匹配整个字符串
【发布时间】:2020-09-19 06:00:12
【问题描述】:

以下是我正在处理的正则表达式模式:

[\t\v\f ]*([^=\s]+)[\t\v\f ]*=[\t\v\f ]*([^=\s]+)[\t\v\f ]*(?:\r?\n\s*([^=\s]+)[\t\v\f ]*=[\t\v\f ]*([^=\s]+)\s*)*

它基本上尝试匹配 .ini 文件的单个部分中的键值对。因此,例如,它应该能够匹配下面的 整个 字符串:

"aa = 11\nbb = 22\ncc = 33"

我尝试在this 正则表达式匹配网站和其他一些网站上对其进行测试,它们似乎都匹配仅前两行。以下是匹配的样子(禁用全局标志)

但是,当我尝试强制正则表达式查找所有 3 行时,如下所示:

[\t\v\f ]*([^=\s]+)[\t\v\f ]*=[\t\v\f ]*([^=\s]+)[\t\v\f ]*(?:\r?\n\s*([^=\s]+)[\t\v\f ]*=[\t\v\f ]*([^=\s]+)\s*){2}

那么它似乎可以匹配整个字符串。

谁能给我一个很好的理由说明为什么上面的整个字符串与我的正则表达式不匹配?另外,我应该使用什么正则表达式来匹配字符串中的 all 键值对,就像我上面写的那样?

【问题讨论】:

  • 如果你打开全局标志,你的第一个正则表达式就可以工作。不过,我还没有真正看过它。

标签: regex parsing ini


【解决方案1】:

您的问题是非捕获组末尾的\s*;这是贪婪的,并在包含bb = 22 的行的末尾吸收了垂直空白,并防止在其中包含cc = 33 的行上再次进行组匹配。将其更改为[\t\v\f ](甚至\s*?)会使正则表达式根据需要匹配整个字符串。请参阅 regex101 上的 demo。添加{2} 量词时它起作用的原因是匹配的愿望使引擎在处理\s* 时回溯到它可以再次匹配非捕获组的点。

【讨论】:

  • 有道理。谢谢。
  • @deniz 不用担心 - 我很高兴能帮上忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多