可能的正则表达式可以匹配以下任何一项:
Eggs and Legs
Legs and Eggs
我只能想到以下正则表达式:
(Eggs|Legs) and (Eggs|Legs)
但我想避免匹配:
Eggs and Eggs
Legs and Legs
PS:编辑我的解决方案添加括号,
答案 0 :(得分:6)
使用捕获组和否定前瞻:
/(Eggs|Legs) and (?!\1)(?:Eggs|Legs)/
即。第一个和最后一个单词可以是Eggs
或Legs
,但capture是第一个单词(使用(...)
),然后确保and
不是(?!...)
后跟该字词(使用negative lookahead(\1
)代替第一个字({{1}}))。
在行动here中查看。
答案 1 :(得分:3)
你只能想到的正则表达式是不正确的:它错过了一些括号。它实际上匹配包含Eggs
,Legs and Eggs
或Legs
的任何字符串。
正确的表格是
/(Eggs|Legs) and (Eggs|Legs)/
要使其正常运行,请检查$1 ne $2
。
答案 2 :(得分:3)
这将捕获and
周围的两个单词并将两者打印出来,除非第一个捕获的单词与第二个单词相同:
use strict;
use warnings;
open my $in, '<', 'in.txt';
while(<$in>){
chomp;
my ($match1, $match2) = /(\w+) and (\w+)/;
print "$match1\t$match2\n" unless $match1 eq $match2;
}