我希望匹配除了遇到特定字符串时的每个字符,然后停在那里。
以下是基于代码的解释:
#!/usr/bin/perl
$string="111s111ab1s";
#-- greedy match
$string =~ /^(.*)s/;
print "$1\n"; # prints 111s11111
#-- ungreedy match
$string =~ /HOW TO/;
print "$1\n"; # prints 111
举一个简单的例子 - 如果你需要一个更好的例子。
答案 0 :(得分:3)
#-- ungreedy match
if ( $string =~ /^(.*?)s/s ) {
print "$1\n"; # prints 111
}
如果您的字符串包含换行符,则必须使用/ s标志;没有它,.
与换行符不匹配。检查你的正则表达式是否匹配总是一个好主意;如果不这样做,$1
可能会从其他一些成功的正则表达式匹配中遗留下来。
答案 1 :(得分:2)
最简单的解决方案是在?
量词之后添加问号(*
)。这意味着查找任何字符(除了换行符)并找到(0
或更多),直到找到s
。一旦你指定了问号,你就会说明(不要贪婪.. ,一旦找到s
...停止,你就会'重新完成。)
use strict;
use warnings;
my $string = "111s111ab1s";
print $1 if $string =~ /^(.*)s/; # 111s111ab1
print $1 if $string =~ /^(.*?)s/; # 111
答案 2 :(得分:1)
我会搜索任何不是s的东西,比如这个......
$string =~ /^([^s]*)s/;
答案 3 :(得分:1)
正如regular-expressions.info documentation所说,你可以使用算子懒惰:
懒惰而不是贪婪
懒惰量词有时也被称为“不合理”或“不情愿”。 你可以通过在加号后面加一个问号来做到这一点 正则表达式。你可以用星星,花括号和星号做同样的事情 问号本身。
因此,你的正则表达式中的贪心明星运算符是:
$string =~ /^(.*)s/;
虽然 ungreedy 或懒惰会是:
$string =~ /^(.*?)s/;