【发布时间】:2016-10-23 14:03:34
【问题描述】:
有没有办法只打印匹配的字符串直到匹配?
use strict;
use warnings;
my $match_re = qr/\QCopyright (c) \E( \d .* ) \Q by Bill Shakespeare.\E/xi;
my $str = 'Copyright (c) 2008,2009-2011 by Wordsworth';
if ($str =~ $match_re) {
print "\ncomplete match\n";
} else {
print "\npartial match: \n";
}
在本例中,我想打印partial match: Copyright (c) 2008,2009-2011 by,因为它与此匹配。
【问题讨论】:
-
所以如果
$str是Copyright (foo)你只想打印Copyright (? -
@ThisSuitIsBlackNot,是的
-
这个概念按照定义没有意义。正则表达式引擎通常会回溯 NUMEROUS 次,因此有很多很多部分匹配。忽略
Copyr在您的示例中也是部分匹配的事实,考虑如果名称是Cory而不是Wordsworth会发生什么。这意味着Cory中的Co也将是部分匹配。请更好地定义您想要做什么。 -
@ikegami 我认为他们想要最长的公共前缀,除了前缀是正则表达式而不是固定字符串。
-
我想在模式匹配失败的地方添加一个标记,比如
^,这样就很容易识别不匹配的位置,例如,如果$str有Copyright (c) 2008,2009-2011 by Bill Shaakespeare,那么我喜欢打印Copyright (c) 2008,2009-2011 by Bill Shaa^kespeare,以便识别错别字。