尝试学习Regex子例程。我做了这个正则表达式来匹配IP地址。它可以在Notepad ++中运行,但是当我在网络上的PCRE测试仪中尝试过时,它只能匹配最后一组中最多2个数字的IP。你能帮我理解为什么吗?
\b((\d{1,2}|[01]\d{2}|2[0-4]\d|25[0-5])\.){3}(?2)\b
在NPP的示例“ 192.168.0.219 192.168.0.21”中,我有2个匹配项,而PCRE(regex101.com)仅匹配第二个地址。
答案 0 :(得分:3)
Notepad ++对正则表达式使用boost。参见此处:Which regex engine does Notepad++ use?。这样可以解释差异。
问题是这段\d{1,2}
,对于递归(在PCRE上),您无法按预期工作。在非递归情况下,您必须在数字后找到一个点。
但是由于递归目标组2是您“进入”递归模式,所以您发现\d{1,2}
(来自21
的{{1}})并结束了递归。然后,在退出时,您会期望找到219
,但没有找到\b
,所以失败了。
也许boost引擎在进入递归之前考虑了整个表达式。也许它有一个不同的回溯系统,该系统允许回溯递归并再次对一组其他选项重新评估递归。最后,不同的实现会导致不同的结果。
要使两个thig都一样工作,可以使用以下方法:
9
也就是说,您将\b(([01]\d{2}|2[0-4]\d|25[0-5]|\d{1,2})\.){3}(?2)\b
作为最后一个选项。
通常,对选项组进行排序(例如,\d{1,2}
)是良好做法,这样最长的模式就首先出现(如果可能出现重叠)>
或者,如果您想在组上保持相同的顺序,则可以使用:
(aaa|aa|a)
(我们在\b((\d{1,2}(?!\d)|[01]\d{2}|2[0-4]\d|25[0-5])\.){3}(?2)\b
之后添加了负面的印象,之后不得有数字)