【问题标题】:In Perl pattern match, print the matched string up to the match在 Perl 模式匹配中,打印匹配的字符串直到匹配
【发布时间】: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,因为它与此匹配。

【问题讨论】:

  • 所以如果$strCopyright (foo) 你只想打印Copyright (
  • @ThisSuitIsBlackNot,是的
  • 这个概念按照定义没有意义。正则表达式引擎通常会回溯 NUMEROUS 次,因此有很多很多部分匹配。忽略Copyr 在您的示例中也是部分匹配的事实,考虑如果名称是Cory 而不是Wordsworth 会发生什么。这意味着Cory 中的Co 也将是部分匹配。请更好地定义您想要做什么。
  • @ikegami 我认为他们想要最长的公共前缀,除了前缀是正则表达式而不是固定字符串。
  • 我想在模式匹配失败的地方添加一个标记,比如^,这样就很容易识别不匹配的位置,例如,如果$strCopyright (c) 2008,2009-2011 by Bill Shaakespeare,那么我喜欢打印Copyright (c) 2008,2009-2011 by Bill Shaa^kespeare,以便识别错别字。

标签: regex perl


【解决方案1】:

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

开头
$string ='\bibitem{bibtex_key} rest';

您可以使用以下行提取这两个部分:

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

现在您可以轻松适应您的需求 :)

【讨论】:

    猜你喜欢
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多