我运行一个简单的程序:
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
.
为什么*?
还贪心?(我想要最小的比赛.)
原子按顺序匹配,第一个原子之后的每个原子必须在前一个原子离开匹配的位置匹配.(第一个原子隐含在前面\A(?s:.)*?
.)这意味着.*
/ .*?
不会决定它开始匹配的位置; 它只能决定它停止匹配的地方.
这并不贪心.\.ht
将匹配带到位置10,在位置10,最小值.*?
可以匹配并且仍然具有模式匹配的其余部分access/.htdf
.事实上,它是唯一.*?
可以在第10位匹配并且仍然具有其余模式匹配的东西.
我想你想删除路径的最后一部分,如果它开始.ht
,留下前面/
的位置.为此,您可以使用以下任一方法:
s{/\.ht[^/]*$}{/}
Run Code Online (Sandbox Code Playgroud)
要么
s{/\K\.ht[^/]*$}{}
Run Code Online (Sandbox Code Playgroud)
这并不贪心.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)