2011-03-28 62 views
11

我必须删除两个分隔符之间的字符串,即 从“123XabcX321”我想要“123321”。 对于一个简单的例子,我很好:“渴望”正则表达式匹配

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

但如果有像“123XabcXasdfjXasdX321”输入的不确定性,它与最近的X第X相匹配,并且我得到“123321”,但我想“ 123asdfj321" 。 有没有办法指定一个匹配第一个有效分隔符而不是最后一个匹配的“热切”匹配?

回答

28

它通常被称为“不真实”,你把一个?在量词后面:s/X(.*?)X//;

+1

并且在给出的例子中,/ g需要多次替换。 – ysth 2011-03-28 03:06:05

+0

我认为“非贪心”是更常见的术语。无论如何,默认值是贪婪匹配,而你想要的是相反的。 – cjm 2011-03-28 03:39:18

+0

谢谢,那就是我正在寻找的 – GClaramunt 2011-03-28 23:18:48

6

如果可以,请避免使用非贪婪修饰符。使用它可能会导致“意外”结果,因为添加?实际上并不妨碍.*匹配任何内容。例如,

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

为了避免匹配X,您可以使用以下命令:

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

如果X真是了不起大于一个字符,你可以使用以下命令:

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

有趣...我会尝试。在我的情况下,X是不止一个字符。我需要解码?:(?!X)tho – GClaramunt 2011-03-28 23:20:48

+0

@GClaramunt,'(?:)'在正则表达式中类似于Perl中的'()'。在这种情况下,它表示'*'影响'(?!X).'而不是'.'。 '()'经常被滥用于此目的。 – ikegami 2011-03-29 22:53:02

+0

@GClaramunt,'(?!)'检查后面的内容与包含的模式不匹配。 – ikegami 2011-03-29 22:53:50