【问题标题】:Match every character except for a particular string in perl匹配除 perl 中的特定字符串之外的每个字符
【发布时间】:2014-08-20 03:58:24
【问题描述】:

我想匹配每个字符,除非遇到特定字符串然后停在那里。

这是一个基于代码的解释:

#!/usr/bin/perl

$string="111s111ab1s";

#-- greedy match
$string =~ /^(.*)s/;
print "$1\n"; # prints 111s11111

#-- ungreedy match
$string =~ /HOW TO/;
print "$1\n"; # prints 111

做一个简单的例子——如果你需要一个更好的例子。

【问题讨论】:

    标签: regex string perl pattern-matching


    【解决方案1】:
    #-- ungreedy match
    if ( $string =~ /^(.*?)s/s ) {
        print "$1\n"; # prints 111
    }
    

    如果您的字符串包含换行符,则 /s 标志是必需的;没有它,. 不匹配换行符。检查您的正则表达式是否匹配总是一个好主意;如果不这样做,$1 可能会从其他一些成功的正则表达式匹配中遗留下来。

    【讨论】:

      【解决方案2】:

      最简单的解决方案是在 * 量词之后添加一个问号 (?)。这意味着寻找任何字符(除了换行符)并找到(0 或更多),直到找到s。一旦你指定了问号,你就是在声明(别贪心..一旦你找到s...停止,你就完成了。)

      use strict;
      use warnings;
      
      my $string = "111s111ab1s";
      
      print $1 if $string =~ /^(.*)s/;  # 111s111ab1
      print $1 if $string =~ /^(.*?)s/; # 111
      

      【讨论】:

        【解决方案3】:

        我会搜索任何不是 s 的东西,像这样......

        $string =~ /^([^s]*)s/;
        

        【讨论】:

          【解决方案4】:

          正如regular-expressions.info documentation 所说,您可以使用操作员惰性:

          懒惰而不是贪婪

          惰性量词有时也被称为“不贪婪”或“不情愿”。 你可以通过在加号后面加一个问号来做到这一点 正则表达式。您可以对星号、花括号和 问号本身。

          因此,您的正则表达式中的 greedy 星号运算符是:

          $string =~ /^(.*)s/;
          

          虽然不贪心或懒惰是:

          $string =~ /^(.*?)s/;
          

          【讨论】:

            猜你喜欢
            • 2013-12-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-04-04
            • 1970-01-01
            • 2011-09-01
            • 1970-01-01
            相关资源
            最近更新 更多