【问题标题】:How can I match a pipe character followed by whitespace and another pipe?如何匹配一个管道字符,后跟空格和另一个管道?
【发布时间】:2008-10-08 13:07:16
【问题描述】:

我试图在以| | 开头的字符串中查找所有匹配项。

我试过了:if ($line =~ m/^\\\|\s\\\|/) 没有用。

有什么想法吗?

【问题讨论】:

  • 如果这不起作用,您应该提供更多上下文。
  • 或者写一个不同的问题:)

标签: regex perl


【解决方案1】:

您转义管道的次数太多,实际上转义的是反斜杠。

print "YES!" if ($line =~ m/^\|\s\|/);

【讨论】:

    【解决方案2】:

    管道字符应在 Perl 正则表达式中使用单个反斜杠进行转义。 (Perl 正则表达式与 POSIX 正则表达式有点不同。如果您在 grep 中使用它,情况会有所不同。)如果您专门寻找它们之间的空格,则使用未转义的空格。它们在 Perl 正则表达式中是完全可以接受的。这是一个简短的测试程序:

    my @lines = <DATA>;
    
    for (@lines) {
        print if /^\| \|/;
    }
    
    __DATA__  
    | | Good - space  
    || Bad - no space  
    |   | Bad - tab  
     | | Bad - beginning space  
            Bad - no bars  
    

    【讨论】:

      【解决方案3】:

      如果您要搜索的是文字字符串,则不需要正则表达式。

      my $search_for = '| |';
      my $search_in = whatever();
      if ( substr( $search_in, 0, length $search_for ) eq $search_for ) {
          print "found '$search_for' at start of string.\n";
      }
      

      或者这样做可能更清楚:

      my $search_for = '| |';
      my $search_in = whatever();
      if ( 0 == index( $search_in, $search_for ) ) {
          print "found '$search_for' at start of string.\n";
      }
      

      当您想在正则表达式中使用文字时,您可能还想查看quotemeta

      【讨论】:

      • 您的解决方案仅在空格是空格字符时才有效。当它是任何其他空格时,它会失败,例如制表符。
      【解决方案4】:

      删除 ^ 和双反斜杠。 ^ 强制字符串位于字符串的开头。由于您要在一个字符串中查找所有匹配项,因此这可能不是您想要的。

      m/\|\s\|/
      

      【讨论】:

        【解决方案5】:

        怎么样:

        m/^\|\s*\|/ 
        

        【讨论】:

        • 谢谢。我之前尝试过,但它似乎没有返回匹配项。这就是让我尝试双反斜杠的原因。感谢您的帮助。
        • \s* 将匹配零个或多个空格字符,根据问题,他想匹配一个空格字符。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-14
        • 2019-04-30
        • 2022-10-14
        • 2021-01-13
        • 1970-01-01
        • 1970-01-01
        • 2020-10-13
        相关资源
        最近更新 更多