繁体   English   中英

两步正则表达式与Perl中的变量匹配

[英]2-step regular expression matching with a variable in Perl

我正在Perl中进行两步正则表达式查找,我的文本看起来像这样:

here is some text 9337 more text AA 2214 and some 1190 more BB stuff 8790 words

我还有一个具有以下值的哈希值:

%my_hash = ( 9337 => 'AA', 2214 => 'BB', 8790 => 'CC' );

这是我需要做的:

  1. 查找号码
  2. 使用my_hash在文本代码中查找数字
  3. 检查文本代码是否出现在所标识数字的50个字符内,如果为真,则打印结果

所以我正在寻找的输出是:

Found 9337, matches 'AA'
Found 2214, matches 'BB'
Found 1190, no matches
Found 8790, no matches

这是我到目前为止的内容:

while ( $text =~ /(\d+)(.{1,50})/g ) {
  $num = $1;
  $text_after_num = $2;
  $search_for = $my_hash{$num};
  if ( $text_after_num =~ /($search_for)/ ) {
    print "Found $num, matches $search_for\n";
  }
  else {
   print "Found $num, no matches\n";
  }

除了唯一正确的匹配项是9337外,这种工作; 代码不匹配2214。我认为原因是9337上的正则表达式匹配在第二步匹配的数字之后包含50个字符,然后当正则表达式引擎再次启动时,它是从2214.有解决此问题的简便方法吗? 我认为\\G修饰符可以在这里为我提供帮助,但我不太清楚如何。

任何建议或帮助将是巨大的。

你有贪婪的问题。 1,50将消耗尽可能多的能量。 您的正则表达式应为/(\\d+)(.+?)(?=($|\\d))/

解释一下,问号会使多重匹配成为非贪婪(一旦匹配下一个模式,它将停止-下一个模式优先)。 ?=是一个超前运算符,用于表示“检查下一个元素是否为数字。如果是,则匹配但不消耗”。 这允许第一个数字在正则表达式的开头被拾取并放入下一个匹配的模式。

[编辑]我向前瞻添加了一个可选的最终值,以使它不会在最后一场比赛中死亡。

只需使用:

/\b\d+\b/g

如果不需要,为什么还要匹配所有内容? 您应该使用其他函数来确定数字在哪里:

/(?=9337.{1,50}AA)/

如果AA距离9337的末尾超过50个字符,则此操作将失败。当然,您将必须对变量进行插值以匹配hashe的键和值。 这只是您的第一个键/值对的示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM