gpt4 book ai didi

正则表达式子程序在 Npp 中工作,但在 PCRE 中表现奇怪

转载 作者:行者123 更新时间:2023-12-01 01:44:18 27 4
gpt4 key购买 nike

尝试学习 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) 仅匹配第二个地址。

最佳答案

Notepad++ 使用 boost对于正则表达式。看这里:Which regex engine does Notepad++ use? .所以这可以解释差异。

问题是这块\d{1,2} ,这不会像您期望的那样使用递归(在 PCRE 上)。在非递归情况下,您必须在数字后找到一个点。

但是由于递归针对第 2 组,您在递归模式上“输入”,您会发现 \d{1,2} ( 21 来自 219 )并结束递归。然后,当您退出时,您应该会找到 \b ,但你没有(你找到一个 9 ),所以你失败了。

也许 boost 引擎在进入递归之前考虑了整个表达式。或者它可能有一个不同的回溯系统,允许回溯递归并再次为其他一些选项组重新评估递归。最终,不同的实现会导致不同的结果。

要使两个 thigs 工作相同,您可以使用以下命令:
\b(([01]\d{2}|2[0-4]\d|25[0-5]|\d{1,2})\.){3}(?2)\b
也就是说,您放置 \d{1,2}作为最后的选择。

Demo

一般来说,它是一个 良好做法 对选项组进行排序(例如,让我们说 (aaa|aa|a) ),以便最长的模式首先出现(如果可能出现重叠)

作为替代方案,如果您想在组上保持相同的顺序,您可以使用:
\b((\d{1,2}(?!\d)|[01]\d{2}|2[0-4]\d|25[0-5])\.){3}(?2)\b
(我们为 \d{1,2} 后面加了一个负向查找 | 后面一定不能有数字)

关于正则表达式子程序在 Npp 中工作,但在 PCRE 中表现奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52934690/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com