我得到了这个正则表达式代码:
((\w)(\w)\3\2)
它匹配包含anna,otto,xyyx等所有东西......
但我希望匹配不包含这种模式的所有内容。 我怎么能这样做?
答案 0 :(得分:1)
此问题已在此SO post上提出。你应该试试这个:
^((?!(\w)(\w)\3\2).)*$
答案 1 :(得分:0)
最初,我认为这样做符合你的要求。但由于@WiktorStribiżew在下面提出的原因,它不起作用。特别是AAAB和ABBC等测试字符串应与下面的匹配,但不
^((\w)(\w)(?!\3)(?!\2))
我的第二个想法是使用
^((\w)(\w)(?!\3\2))
这确实有效。
新的测试程序。这将生成从AAAA到ZZZZ的所有可能的字符串。然后使用非正则表达式检查来测试每个字符串是否匹配。最后,检查每个字符串是否符合正面
$ findrepeats,^((\w)(\w)(\3)(\2))
匹配abba
和否定
$ repeatnomatch ^((\w)(\w)(?!\3)(?!\2))
匹配ab [not b] [not a]
use strict;
use warnings;
my @fourchar=('AAAA'..'ZZZZ');
my @norepeats=();
my @hasrepeats=();
for my $pattern ('AAAA' .. 'ZZZZ') {
if (checkstring($pattern)) {
push @hasrepeats, $pattern;
} else {
push @norepeats, $pattern;
}
}
print scalar @hasrepeats, " strings with repeated abba\n";
print scalar @norepeats, " strings with ab[not b][not a]\n";
my $findsrepeats=qr/^((\w)(\w)(\3)(\2))/;
my $repeatnomatch=qr/^((\w)(\w)(?!\3\2))/;
for my $example (@hasrepeats) {
die $example if (not($example=~$findsrepeats));
die $example if ($example=~$repeatnomatch);
}
for my $example (@norepeats) {
die $example if (not($example=~$repeatnomatch));
die $example if ($example=~$findsrepeats);
}
print "pass\n";
sub checkstring {
my $s=shift;
my @element=split(//,$s);
return ($element[0] eq $element[3] &&
$element[1] eq $element[2]);
}
运行上面的perl程序应该产生这个输出
$ perl nr3.pl
676 strings with repeated abba
456300 strings with ab[not b][not a]
pass