匹配除perl中特定字符串之外的每个字符

时间:2014-06-29 18:29:13

标签: regex string perl pattern-matching

我希望匹配除了遇到特定字符串时的每个字符,然后停在那里。

以下是基于代码的解释:

#!/usr/bin/perl

$string="111s111ab1s";

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

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

举一个简单的例子 - 如果你需要一个更好的例子。

4 个答案:

答案 0 :(得分:3)

#-- ungreedy match
if ( $string =~ /^(.*?)s/s ) {
    print "$1\n"; # prints 111
}

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

答案 1 :(得分:2)

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

use strict;
use warnings;

my $string = "111s111ab1s";

print $1 if $string =~ /^(.*)s/;  # 111s111ab1
print $1 if $string =~ /^(.*?)s/; # 111

答案 2 :(得分:1)

我会搜索任何不是s的东西,比如这个......

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

答案 3 :(得分:1)

正如regular-expressions.info documentation所说,你可以使用算子懒惰:

  

懒惰而不是贪婪

     

懒惰量词有时也被称为“不合理”或“不情愿”。   你可以通过在加号后面加一个问号来做到这一点   正则表达式。你可以用星星,花括号和星号做同样的事情   问号本身。

因此,你的正则表达式中的贪心明星运算符是:

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

虽然 ungreedy 或懒惰会是:

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