regex exp只检测一次“abc-xxx”模式

时间:2013-07-16 23:43:39

标签: regex perl regex-negation

以下是字符串列表

  1. abc-1234你好~abc-3456 ok~abc-4456
  2. ABC-1234
  3. abc-2356 hi~abc-1234 ok
  4. abc-1234 ok~abc-1234你好
  5. abc-1234 ok~abc-1234你好~abc-1456 ok ok
  6. 需要编写一个正则表达式模式,该模式将检测abc-1234是否是唯一存在的“abc-”模式并与之匹配。如果abc-1234与另一个abc-xxxx模式一起出现,我们就不应该匹配。换句话说,我需要编写一个正则表达式模式来匹配abc-1234的出现,当它是唯一存在的abc模式时。请注意,abc模式始终以'〜'

    开头

    所以在上面的例子中,当我们尝试在正则表达式模式和字符串之间进行匹配时,我们得到以下结果: 1.不匹配 2.比赛 3.不匹配 4.匹配 5.不符合

    正则表达专家可以帮助我吗?

    谢谢!

3 个答案:

答案 0 :(得分:3)

使用正负的lookeheads:

use strict; use warnings;
my @s = ('abc-1234 hi hello~abc-3456 ok~abc-4456',
    'abc-1234', 'abc-2356 hi~abc-1234 ok', 'abc-1234 ok~abc-1234 hello',
    'abc-1234 ok~abc-1234 hello~abc-1456 ok ok');

for my $s (@s) {
    if ($s !~ /^abc-(\d+)(?=.*~abc-(?!\1))/) {
        print "$s\n";
    }
}

输出

abc-1234
abc-1234 ok~abc-1234 hello

答案 1 :(得分:0)

使用负面预测锚定以开始输入:

^(?!(.*abc-\d{4}){2}.*$)abc-\d{4}

答案 2 :(得分:0)

使用2个正则表达式的Perl解决方案。它得到所有匹配的计数,abc- \ d \ d \ d \ d并将该计数与abc-1234匹配的计数进行比较。

print if  ( () = /abc-\d\d\d\d/g) ==  ( () = /abc-1234/g);