正则表达式不匹配整个字符串
Regex does not match the whole string
以下是我正在处理的正则表达式模式:
[\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 键值对,就像我上面写的那样?
你的问题是非捕获组末尾的\s*
;这是贪婪的,吸收了包含 bb = 22
的行末尾的垂直白色-space 并阻止了在其中包含 cc = 33
的行上再次进行组匹配。将其更改为 [\t\v\f ]
(甚至 \s*?
)可使正则表达式根据需要匹配整个字符串。请参阅 regex101 上的 demo。添加 {2}
量词时它起作用的原因是匹配的愿望使引擎在处理 \s*
时回溯到可以再次匹配非捕获组的点。
以下是我正在处理的正则表达式模式:
[\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 键值对,就像我上面写的那样?
你的问题是非捕获组末尾的\s*
;这是贪婪的,吸收了包含 bb = 22
的行末尾的垂直白色-space 并阻止了在其中包含 cc = 33
的行上再次进行组匹配。将其更改为 [\t\v\f ]
(甚至 \s*?
)可使正则表达式根据需要匹配整个字符串。请参阅 regex101 上的 demo。添加 {2}
量词时它起作用的原因是匹配的愿望使引擎在处理 \s*
时回溯到可以再次匹配非捕获组的点。