以下是字符串列表
需要编写一个正则表达式模式,该模式将检测abc-1234是否是唯一存在的“abc-”模式并与之匹配。如果abc-1234与另一个abc-xxxx模式一起出现,我们就不应该匹配。换句话说,我需要编写一个正则表达式模式来匹配abc-1234的出现,当它是唯一存在的abc模式时。请注意,abc模式始终以'〜'
开头所以在上面的例子中,当我们尝试在正则表达式模式和字符串之间进行匹配时,我们得到以下结果: 1.不匹配 2.比赛 3.不匹配 4.匹配 5.不符合
正则表达专家可以帮助我吗?
谢谢!
答案 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);