以下是我正在处理的正则表达式模式:
[\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正则表达式匹配的网站以及其他一些网站上进行测试,它们似乎都匹配仅前两行。匹配结果如下所示:(禁用全局标志):
但是,当我尝试强制正则表达式如下查找所有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键值对,就像我上面写的那样?
您的问题是非捕获组结尾处的\s*
;这是贪婪的行为,它吸收了包含bb = 22
的行的末尾的垂直空白,并阻止了该组再次匹配其中包含cc = 33
的行。将其更改为[\t\v\f ]
(甚至\s*?
)可使正则表达式根据需要匹配整个字符串。请参阅regex101上的demo。当您添加{2}
量词时,它起作用的原因是,对匹配的渴望使引擎在处理\s*
时回溯到可以再次与非捕获组匹配的点。