gpt4 book ai didi

regex - 为什么 perl regex '*?' 保持贪婪?

转载 作者:行者123 更新时间:2023-12-04 06:58:21 26 4
gpt4 key购买 nike

我运行一个简单的程序:

my $_ =  '/login/.htaccess/.htdf';
s!(/\.ht.*?)$!/!;
print "$_ $1";

/login/ /.htaccess/.htdf
我希望这个正则表达式只匹配 /.htdf .

示例 2:
my $_ =  'abcbc';
m/(b.*?)$/;
print "$_ $1\n";

abcbc bcbc
我期待 bc .

为什么是 *?还是贪心? (我想要最小的匹配。)

最佳答案

原子按顺序匹配,第一个原子之后的每个原子必须在前一个原子停止匹配的位置匹配。 (第一个原子隐含在 \A(?s:.)*? 前面。)这意味着 .*/.*?无法决定从哪里开始匹配;它只能决定它在哪里停止匹配。

示例 1

这不是贪婪。 \.ht将匹配带到位置 10,在位置 10,最小值 .*?可以匹配并且仍然有模式匹配的其余部分是 access/.htdf .其实只有这样.*?可以在位置 10 处匹配并且仍然具有模式匹配的其余部分。

如果以 .ht 开头,我认为您想删除路径的最后一部分, 留下前面的 /到位。为此,您可以使用以下任一方法:

s{/\.ht[^/]*$}{/}

或者
s{/\K\.ht[^/]*$}{}

示例 2

这不是贪婪。 b将匹配带到位置 2,在位置 2,最小值 .*?可以匹配并且仍然有模式匹配的其余部分是 cbc .其实只有这样 .*?可以在位置 2 匹配并且仍然具有模式匹配的其余部分。

您可能正在寻找
/b[^b]*$/

或者
/b(?:(?!b).)*$/    # You'd use this if "b" was really more than one char.

关于regex - 为什么 perl regex '*?' 保持贪婪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32253377/

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