3

这是字符串列表

  1. abc-1234 你好~abc-3456 好的~abc-4456
  2. abc-1234
  3. abc-2356 hi~abc-1234 ok
  4. abc-1234 好的~abc-1234 你好
  5. abc-1234 ok~abc-1234 你好~abc-1456 ok ok

需要编写一个正则表达式模式来检测 abc-1234 是否是唯一存在的“abc-”模式并匹配它。如果 abc-1234 与另一个 abc-xxxx 模式一起出现,我们不应该匹配。换句话说,当 abc-1234 是唯一存在的 abc- 模式时,我需要编写一个正则表达式模式来匹配 abc-1234 的出现。请注意,abc 模式总是以 '~' 开头

所以在上述情况下,当我们尝试在正则表达式模式和字符串之间进行匹配时,我们会得到以下结果: 1. 不匹配 2. 匹配 3. 不匹配 4. 匹配 5. 不匹配

正则表达式专家可以在这里帮助我吗?

谢谢!

4

3 回答 3

3

使用正负前瞻:

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
于 2013-07-16T23:52:48.723 回答
0

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

print if  ( () = /abc-\d\d\d\d/g) ==  ( () = /abc-1234/g);
于 2013-07-17T02:29:47.927 回答
0

使用锚定到输入开始的否定前瞻:

^(?!(.*abc-\d{4}){2}.*$)abc-\d{4}
于 2013-07-16T23:50:59.493 回答