正则表达式与整个字符串不匹配

时间:2020-05-31 23:31:00

标签: regex parsing ini

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

[\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正则表达式匹配网站和其他一些网站上进行测试,它们似乎都只匹配前2行。匹配结果如下所示:(禁用了全局标志)

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}

这似乎可以匹配整个字符串。

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

1 个答案:

答案 0 :(得分:1)

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