gpt4 book ai didi

regex - 惰性量词 {,}?没有像我期望的那样工作

转载 作者:行者123 更新时间:2023-12-04 23:17:44 25 4
gpt4 key购买 nike

我有惰性量词的问题。或者很可能我误解了我应该如何使用它们。

Regex101 上测试
我的测试字符串是:123456789D123456789.{1,5} 匹配 12345.{1,5}? 匹配 1
我对两场比赛都很好。
.{1,5}?D 匹配 56789D !!我希望它匹配 9D
感谢您澄清这一点。

最佳答案

首先,请 不要将正则表达式中的贪婪和懒惰视为获得最长/最短匹配 的手段。 “贪婪”和“懒惰”术语仅与模式可以匹配的最右侧字符有关,对最左侧的字符没有任何影响。当您使用惰性量词时,它将保证您匹配的子字符串的结尾将是第一个找到的,而不是最后一个找到的(将返回一个贪婪的量词)。

正则表达式引擎从左到右分析一个字符串。因此,它搜索符合模式的第一个字符,然后,一旦找到匹配的子字符串,它就会作为匹配项返回。

让我们看看它如何用 .{1,5}D 解析字符串:找到 1 并测试 D。找到 D 后没有 1 ,正则表达式引擎扩展惰性量词并匹配 12 并尝试匹配 D 。在 3 之后有 2 ,同样,引擎扩展了惰性点并做了 5 次。扩展到最大值后,看到有 12345 ,下一个字符不是 D 。由于引擎达到最大限制量词值,匹配失败,测试下一个位置。

5 的位置也会发生同样的情况。当引擎到达 5 时,它​​尝试匹配 5D ,失​​败,尝试 56D ,失​​败, 567D ,失​​败, 5678D - 再次失败,当它尝试匹配 56789D 时 - Bingo! - 找到匹配项。

这清楚地表明,模式开头的 惰性量化子模式默认会“贪婪”地行动,即它不会匹配最短的子字符串

这是 regex101.com 的可视化:

enter image description here

现在,这是 一个有趣的事实 :模式末尾的 .{1,5}? 将始终匹配 1 个字符(如果有),因为要求至少匹配 1 个字符,并且足以返回有效匹配项。所以,如果你写 D.{1,5}? ,你会在 D1 中得到 D6123456789D12345D678904

趣事 2 :在 .NET 中,您可以“要求”正则表达式引擎在 RightToLeft 修饰符的帮助下从右到左分析字符串。然后,使用 .{1,5}?D ,您将获得 9D ,请参阅 this demo

趣事 3 :在 .NET 中,如果 (?<=(.{1,5}?))D 作为输入传递,9 会将 123456789D 捕获到组 1 中。发生这种情况的原因是 lookbehind is implemented in .NET regex(.NET 反转字符串以及后视内的模式,然后尝试匹配反转字符串上的单个模式)。而在 Java 中,(?<=(.{1,5}))D(贪婪版本)将捕获 9,因为它会尝试范围内所有可能的固定宽度模式,从最短到最长,直到成功。

解决方案是:如果您知道需要 1 个字符后跟 D ,请使用

/.D/

关于regex - 惰性量词 {,}?没有像我期望的那样工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35944441/

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