我必须删除两个分隔符之间的字符串,即 从“123XabcX321”我想要“123321”。 对于一个简单的案例,我很好:
$_=<>;
s/X(.*)X//;
print;
但是如果像“123XabcXasdfjXasdX321”这样输入中存在歧义,它会将第一个X与最后一个X匹配,我得到“123321”,但我想要“123asdfj321”。 有没有办法指定与第一个有效的可能分隔符匹配的“急切”匹配而不是最后一个?
答案 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;