Regex 在Perl模式匹配中,将匹配的字符串打印到匹配的字符串

Regex 在Perl模式匹配中,将匹配的字符串打印到匹配的字符串,regex,perl,Regex,Perl,有没有办法只打印匹配的字符串直到匹配 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 { pr

有没有办法只打印匹配的字符串直到匹配

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";
}

在本例中,我想打印
部分匹配:版权(c)20082009-2011 by
,因为它与此匹配。

假设一个以

$string ='\bibitem{bibtex_key} rest';
可以使用以下行提取这两个部分:

 my ($bibtex_key, $rest) = $string =~ m/\\bibitem\{(.*)\}(.*)/;

现在,您可以轻松地根据需要对其进行调整:)

假设一个标准的BibTeX处理条目(bbl),从

$string ='\bibitem{bibtex_key} rest';
可以使用以下行提取这两个部分:

 my ($bibtex_key, $rest) = $string =~ m/\\bibitem\{(.*)\}(.*)/;

现在,您可以轻松地根据需要对其进行调整:)

因此,如果
$str
版权(foo)
的话,您只需要打印
版权(?@ thSuxiDigiBrand),概念没有意义。ReEX引擎通常回溯很多次,因此有很多很多的部分匹配。忽略了“代码> Coprr< /COD>在您的示例中也是部分匹配的事实,考虑如果名称是<代码>科丽<代码>,而不是<代码>华兹华斯< /代码>会发生什么。这意味着
Cory
中的
Co
也将是部分匹配。请提供一个更好的定义,说明您想要做什么。@ikegami我想他们想要最长的公共前缀,除了前缀是正则表达式而不是固定字符串。我想在模式匹配失败的地方添加一个标记,比如
^
,这样就可以很容易地找到确定不匹配的位置,例如,如果
$str
拥有Bill Shaakespeare的
版权(c)20082009-2011
,那么我想打印Bill Shaa^kespeare的
版权(c)20082009-2011,这样很容易识别打字错误。所以如果
$str
版权(foo)
你只想打印
版权(?@ thSuxiDigiBrand),概念没有意义。ReEX引擎通常回溯很多次,因此有很多很多的部分匹配。忽略了“代码> Coprr< /COD>在您的示例中也是部分匹配的事实,考虑如果名称是<代码>科丽<代码>,而不是<代码>华兹华斯< /代码>会发生什么。这意味着
Cory
中的
Co
也将是部分匹配。请提供一个更好的定义,说明您想要做什么。@ikegami我想他们想要最长的公共前缀,除了前缀是正则表达式而不是固定字符串。我想在模式匹配失败的地方添加一个标记,比如
^
,这样就可以很容易地找到确定不匹配的位置,例如,如果
$str
拥有Bill Shaakespeare的
版权(c)20082009-2011
,那么我喜欢打印Bill Shaa^kespeare的
版权(c)20082009-2011,这样很容易识别打字错误。