为什么perl regex'*?' 保持贪心?

Eug*_*kov 8 regex perl

我运行一个简单的程序:

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

OUT
/login/ /.htaccess/.htdf

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

例2:

my $_ =  'abcbc';
m/(b.*?)$/;
print "$_ $1\n";
Run Code Online (Sandbox Code Playgroud)

OUT
abcbc bcbc

我期待bc.

为什么*?还贪心?(我想要最小的比赛.)

ike*_*ami 8

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

例1

这并不贪心.\.ht将匹配带到位置10,在位置10,最小值.*?可以匹配并且仍然具有模式匹配的其余部分access/.htdf.事实上,它是唯一.*?可以在第10位匹配并且仍然具有其余模式匹配的东西.

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

s{/\.ht[^/]*$}{/}
Run Code Online (Sandbox Code Playgroud)

要么

s{/\K\.ht[^/]*$}{}
Run Code Online (Sandbox Code Playgroud)

例2

这并不贪心.b将匹配带到位置2,在位置2,最小值.*?可以匹配,并且仍然具有模式匹配的其余部分cbc.实际上,它是唯一.*?可以在第2位匹配并且仍然具有其余模式匹配的东西.

你可能正在寻找

/b[^b]*$/
Run Code Online (Sandbox Code Playgroud)

要么

/b(?:(?!b).)*$/    # You'd use this if "b" was really more than one char.
Run Code Online (Sandbox Code Playgroud)