如何检查一个Perl正则表达式模式,同时排除另一个

时间:2014-04-22 16:20:43

标签: regex perl

例如,如果我需要过滤以下文字并搜索单词example,但省略该行以哈希#

开头的结果
# filler text example
example
example 2
# test example 3

我尝试了几种不同的组合,但似乎无法做到这一点。

更新

我已尝试/^[^#].*example/g/^(?!#).*example.*/g,但似乎没有得到任何结果

2 个答案:

答案 0 :(得分:4)

尝试将过多的功能捆绑到单个正则表达式中是很奇怪的,而人们似乎不会与任何其他运算符做同样的事情。

写作

没有错
if ( /example/ and not /^#/ ) {
  print;
}

并且它比任何单个等效正则表达式更清晰

如果您愿意,可以将其更改为多个语句;

之类的东西
while (<>) {
  next if /^#/;
  print if /example/;
}

或者您可以通过创建一个临时变量来允许注释从一行开始,该变量包含已删除哈希#之后的所有字符的文本,而是处理

while (<>) {
  my ($trimmed) = /^([^#]*)/;
  print if $trimmed =~ /example/;
}

注意如果您希望使用此处理Perl代码,那么有些情况需要接受特殊处理,其中哈希不表示评论的开始,例如作为$#array构造,或替代模式分隔符,如m#example#

答案 1 :(得分:0)

^((?!#).*example.*)$可以更好地与您的regex101测试人员配合使用。也可以使用标记gm而不是g。测试人员将示例文本作为单个字符串处理,但如果您逐行处理文本,devnull的答案将起作用。