首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个perl匹配模式有什么问题?

这个perl匹配模式有什么问题?
EN

Stack Overflow用户
提问于 2010-12-22 06:56:59
回答 1查看 213关注 0票数 2

对于svn预提交钩子,我希望在将它们提交到服务器之前,在带有特定关键字的行上去掉前导空格(肯定没有标签)。例如,行

代码语言:javascript
复制
    MACRO_1 (ABC, "Some String");

MACRO_1前的前导空间应与之匹配,并移除前导空间。目前,我有以下要匹配的表达式:

代码语言:javascript
复制
   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
   }

当我查看控制台时,会得到以下输出:

代码语言:javascript
复制
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+是不匹配的,在我看来,这是一个或多个空格。

有什么问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-22 06:59:30

在regex操作符中,|的优先级最低。

因此,下面是不正确的正则表达式,以匹配只包含foo或只包含bar的字符串

代码语言:javascript
复制
^foo|bar$

因为它将被视为:

代码语言:javascript
复制
(^foo)|(bar$)

它匹配以foo开头或以bar结尾的任何字符串;因此,它匹配例如foo11bar

正确的正则表达式是^(?:foo|bar)$

同样,在您的示例中,正确的正则表达式是:

代码语言:javascript
复制
if($line =~ /^\s+(?:MACRO_1|MACRO_2|MACRO_3|MACRO_4).*/) {

还请注意,不需要尾随的.*

您可以将regex缩短为:

代码语言:javascript
复制
if($line =~ /^\s+MACRO_[1-4]/) {
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4506863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档