Regex与整个字符串不匹配

问题描述 投票:0回答:1

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

[\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文件的单个部分中匹配键值对。因此,例如,它应该能够匹配下面的whole字符串:

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

我试图在this正则表达式匹配的网站以及其他一些网站上进行测试,它们似乎都匹配仅前两行。匹配结果如下所示:(禁用全局标志)

enter image description here

但是,当我尝试强制正则表达式如下查找所有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个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.