【问题标题】: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/;