“渴望”的正则表达式匹配

时间:2011-03-28 02:46:03

标签: regex perl

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

$_=<>;
s/X(.*)X//;
print;

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

2 个答案:

答案 0 :(得分:33)

它通常被称为“ungreedy”,你放了?在量词之后:s/X(.*?)X//;

答案 1 :(得分:6)

如果可以,请将非贪婪修饰符除了性能提示之外的任何内容。使用它可能会导致“意外”结果,因为添加?实际上并不会阻止.*匹配任何内容。例如,

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

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

s/X[^X]*X//g;

如果X确实大于一个字符,则可以使用以下内容:

s/X(?:(?!X).)*X//g;