RegEx - 查找不包含模式的所有内容

时间:2016-02-03 15:46:58

标签: regex

我得到了这个正则表达式代码:

((\w)(\w)\3\2)

它匹配包含anna,otto,xyyx等所有东西......

但我希望匹配不包含这种模式的所有内容。 我怎么能这样做?

2 个答案:

答案 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