regex - Perl 正则表达式 : Match this or that but NOT the other

标签 regex perl

使用 Perl 和 Regex,是否可以创建一个单行正则表达式来匹配某些短语而不匹配其他短语?规则存储在哈希中,限定符(列)需要匹配提供给它的表达式。

我有一个对象,其中包含我希望作为单行正则表达式输入的限定符。 例如:

my %filters = {
  rule_a  => {
    regex  => {
      qualifier_a => qr/fruits/i,
      qualifier_b => qr/apples|oranges|!bananas/i, # NOT bananas
    }
  }
}

因此,在这种情况下,我想匹配包含“水果”的 qualifier_a 和包含“苹果”、“橙子”但不是“香蕉”的 qualifier_b。

脚本如下遍历每个限定符:

my $match = 1; # Assume a match    
foreach my $qualifier (keys %filters{rule_a}{regex}) {
  # If fails to match, set match as false and break out of loop
  $match = ($qualifier =~ /%filters{rule_a}{regex}{$qualifier}/) ? 1 : 0);
  if(!$match){
   last;
  }
}
if($match){
  # Do all the things
}

想法?

最佳答案

有点复杂,但它的工作:

^.*?bananas.*(*SKIP)(*FAIL)|apples|oranges

Demo

如果第一部分包含bananas,则第一部分将匹配整个字符串,然后强制失败而不在下一个位置重试。

该演示使用 . 使行独立,但如果您的字符串可以包含换行符,您可以使用 s 选项。

关于regex - Perl 正则表达式 : Match this or that but NOT the other,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27362484/

相关文章:

javascript - 替换javascript中的所有\"with\\"

perl - 如何从 Perl 中的 GFF3 文件获取范围内的所有功能?

jquery - Datatables jQuery $(document).ready 不工作并被数字取代

perl - 如何在 Perl 调试器中观察表达式的变化?

perl - 我不确定如何将 Perlbrew 与 Catalyst 结合使用

regex - 如何为以下情况创建正则表达式?

php - 使用 PHP 替换前面带有 MB 或 GB 的不同数字

mysql - 是否可以使用正则表达式在 MySQL 中强制执行数据检查

javascript - 允许使用一个或多个连续大写字母和数字的 PascalCased 的正则表达式

linux - 如何使用 perl/a shell 脚本轻松检查 POP3 或 SMTP 连接是否有效?