我必须删除两个分隔符之间的字符串,即 从“123XabcX321”我想要“123321”。 对于一个简单的例子,我很好:“渴望”正则表达式匹配
$_=<>;
s/X(.*)X//;
print;
但如果有像“123XabcXasdfjXasdX321”输入的不确定性,它与最近的X第X相匹配,并且我得到“123321”,但我想“ 123asdfj321" 。 有没有办法指定一个匹配第一个有效分隔符而不是最后一个匹配的“热切”匹配?
我必须删除两个分隔符之间的字符串,即 从“123XabcX321”我想要“123321”。 对于一个简单的例子,我很好:“渴望”正则表达式匹配
$_=<>;
s/X(.*)X//;
print;
但如果有像“123XabcXasdfjXasdX321”输入的不确定性,它与最近的X第X相匹配,并且我得到“123321”,但我想“ 123asdfj321" 。 有没有办法指定一个匹配第一个有效分隔符而不是最后一个匹配的“热切”匹配?
它通常被称为“不真实”,你把一个?在量词后面:s/X(.*?)X//;
如果可以,请避免使用非贪婪修饰符。使用它可能会导致“意外”结果,因为添加?
实际上并不妨碍.*
匹配任何内容。例如,
$ perl -le'print for "XaXbXY" =~ /X(.*?)XY/;'
aXb
为了避免匹配X
,您可以使用以下命令:
s/X[^X]*X//g;
如果X
真是了不起大于一个字符,你可以使用以下命令:
s/X(?:(?!X).)*X//g;
有趣...我会尝试。在我的情况下,X是不止一个字符。我需要解码?:(?!X)tho – GClaramunt 2011-03-28 23:20:48
@GClaramunt,'(?:)'在正则表达式中类似于Perl中的'()'。在这种情况下,它表示'*'影响'(?!X).'而不是'.'。 '()'经常被滥用于此目的。 – ikegami 2011-03-29 22:53:02
@GClaramunt,'(?!)'检查后面的内容与包含的模式不匹配。 – ikegami 2011-03-29 22:53:50
并且在给出的例子中,/ g需要多次替换。 – ysth 2011-03-28 03:06:05
我认为“非贪心”是更常见的术语。无论如何,默认值是贪婪匹配,而你想要的是相反的。 – cjm 2011-03-28 03:39:18
谢谢,那就是我正在寻找的 – GClaramunt 2011-03-28 23:18:48