Perl正则表达式条件匹配

时间:2014-12-03 11:13:11

标签: regex perl

可能的正则表达式可以匹配以下任何一项:

Eggs and Legs
Legs and Eggs

我只能想到以下正则表达式:

(Eggs|Legs) and (Eggs|Legs)

但我想避免匹配:

Eggs and Eggs
Legs and Legs

PS:编辑我的解决方案添加括号,

3 个答案:

答案 0 :(得分:6)

使用捕获组和否定前瞻:

/(Eggs|Legs) and (?!\1)(?:Eggs|Legs)/

即。第一个和最后一个单词可以是EggsLegs,但capture是第一个单词(使用(...)),然后确保and不是(?!...)后跟该字词(使用negative lookahead\1)代替第一个字({{1}}))。

在行动here中查看。

答案 1 :(得分:3)

你只能想到的正则表达式是不正确的:它错过了一些括号。它实际上匹配包含EggsLegs and EggsLegs的任何字符串。

正确的表格是

/(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;
}