negative regex for perl string pattern match 我看到了这个问题和答案,但哪些答案不适合我的问题。但我的问题也是这样的,我的脚本在下面
use warnings;
use strict;
my @data = <DATA>;
my @match = grep{m/^SEQ.+(!?ALA)/g} @data;
print "@match\n";
__DATA__
SEQ HMK 112 ALA 123
SEQ ALA 322
SEQ 121 ALA 333
SEQ 114 PHE 443
SEQ 11433 GLY 332
SEQ 1123 VAL 121
SEQ 1121 ALA 321
SEQ 981 TRP 44532
SEQ 887 TRP 90
SEQ 11 HIS SPR 443
HTTM SHH 121
HTTM MME 221
HTTM VZE 9
EXP 112
EXP 334 SMZ
我希望,首先检查 SEQ 这个词的开头但不匹配 ALA 行。 我希望输出是:
SEQ 114 PHE 443
SEQ 11433 GLY 332
SEQ 1123 VAL 121
SEQ 981 TRP 44532
SEQ 887 TRP 90
SEQ 11 HIS SPR 443
我该怎么做
答案 0 :(得分:4)
while ( <DATA> ) {
next if m/ALA/;
print if m/^SEQ/;
}
我确信有人可以给你一个基于正则表达式的答案,但这个IMO更清楚发生了什么。
我认为你有两个负面匹配问题。一个是.+
是贪婪的 - 所以你的'ALA'与之相匹配,而'负面匹配'是真的。
另一个是 - 你有?!
错误的方法。
答案 1 :(得分:4)
你真的很接近,正则表达式应该是:
my @match = grep{m/^SEQ(?!.+ALA)/} @data;
只需将模式.+
置于否定前瞻中即可
如果它在外面,那么每一行都匹配,因为你正在搜索以SEQ
开头的行,后跟任意数量的任何字符(即SEQ HMK 112 ALA 123
匹配)然后是不是ALA
, - &gt;好的,因为整行之后没有ALA
。