【问题标题】:Perl regex conditional matchingPerl 正则表达式条件匹配
【发布时间】:2014-12-03 19:38:08
【问题描述】:

什么是可能的正则表达式来匹配以下任何一个:

Eggs and Legs
Legs and Eggs

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

(Eggs|Legs) and (Eggs|Legs)

但我想避免匹配:

Eggs and Eggs
Legs and Legs

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

【问题讨论】:

  • 那个正则表达式甚至不起作用,你可能是指(Eggs|Legs) and (Eggs|Legs)

标签: regex perl


【解决方案1】:

使用捕获组和负前瞻:

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

即第一个和最后一个词可以是EggsLegs,但capture 第一个词(使用(...)),然后确保and 后面没有那个词(使用negative lookahead(?!...)) 无论第一个词是什么 (\1))。

看到它在行动here

【讨论】:

  • @VineetDeoraj 查看更新后的答案。这是一个足够好的解释吗? (Regex 101 的链接包含正则表达式每个部分的详细信息。)
【解决方案2】:

这将捕获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;
}

【讨论】:

    【解决方案3】:

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

    正确的形式是

    /(Eggs|Legs) and (Eggs|Legs)/
    

    要使其正常工作,只需检查 $1 ne $2

    【讨论】:

    • 谢谢。 @Biffen 回答中提到的“ne”?
    • @VineetDeoraj: neperlop 中所述,但两者都应该工作。
    • 我正在讨论如何用这个例子实现 ne,类似于 biffen 的回答或者你对此有其他想法?
    • @VineetDeoraj:是的,只要print if /(Eggs|Legs) and (Eggs|Legs)/ and $1 ne $2;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多