对于svn预提交钩子,我希望在将它们提交到服务器之前,在带有特定关键字的行上去掉前导空格(肯定没有标签)。例如,行
MACRO_1 (ABC, "Some String");MACRO_1前的前导空间应与之匹配,并移除前导空间。目前,我有以下要匹配的表达式:
if($line =~ /^\s+MACRO_1|MACRO_2|MACRO_3|MACRO_4.*/) {
print "Stripping leading space on line $line\n";
$line =~ s/^\s*//gsxm; # strip leading spaces
}当我查看控制台时,会得到以下输出:
Stripping leading space on line MACRO_1;
Stripping leading space on line MACRO_2;
Stripping leading space on line MACRO_3 (ABC, "Some String");
Stripping leading space on line MACRO_1;
Stripping leading space on line MACRO_2;
Stripping leading space on line MACRO_1(123);
Stripping leading space on line MACRO_2(123);
Stripping leading space on line MACRO_1;
Stripping leading space on line MACRO_2;
Stripping leading space on line MACRO_1;这对我来说有点困惑,因为有一些没有前导空间的行,我认为\s+是不匹配的,在我看来,这是一个或多个空格。
有什么问题吗?
发布于 2010-12-22 06:59:30
在regex操作符中,|的优先级最低。
因此,下面是不正确的正则表达式,以匹配只包含foo或只包含bar的字符串
^foo|bar$因为它将被视为:
(^foo)|(bar$)它匹配以foo开头或以bar结尾的任何字符串;因此,它匹配例如foo1和1bar。
正确的正则表达式是^(?:foo|bar)$。
同样,在您的示例中,正确的正则表达式是:
if($line =~ /^\s+(?:MACRO_1|MACRO_2|MACRO_3|MACRO_4).*/) {还请注意,不需要尾随的.*。
您可以将regex缩短为:
if($line =~ /^\s+MACRO_[1-4]/) {https://stackoverflow.com/questions/4506863
复制相似问题