"渴望"的正则表达式匹配

GCl*_*unt 14 regex perl

我必须删除两个分隔符之间的字符串,即From"123XabcX321"我想要"123321".对于一个简单的案例,我很好:

$_=<>;
s/X(.*)X//;
print;
Run Code Online (Sandbox Code Playgroud)

但是如果像"123XabcXasdfjXasdX321"这样输入中存在歧义,它会将第一个X与最后一个X匹配,我得到"123321",但我想要"123asdfj321".有没有办法指定与第一个有效可能的分隔符匹配的"急切"匹配而不是最后一个?

Ano*_*mie 33

它通常被称为"ungreedy",你放一个?量词之后:s/X(.*?)X//;

  • 在给出的示例中,需要多次替换 /g。 (2认同)

ike*_*ami 6

如果可以的话,避免使用非贪婪修饰符作为性能提示.使用它可能会导致"意外"结果,因为添加?实际上不会阻止.*匹配任何内容.例如,

$ perl -le'print for "XaXbXY" =~ /X(.*?)XY/;'
aXb
Run Code Online (Sandbox Code Playgroud)

为避免匹配X,您可以使用以下内容:

s/X[^X]*X//g;
Run Code Online (Sandbox Code Playgroud)

如果X确实是大于一个字符的东西,您可以使用以下内容:

s/X(?:(?!X).)*X//g;
Run Code Online (Sandbox Code Playgroud)