Regex 正则表达式-查找不包含模式的所有内容

Regex 正则表达式-查找不包含模式的所有内容,regex,Regex,我得到了这个正则表达式代码: ((\w)(\w)\3\2) 它匹配所有包含安娜,奥托,xyyx 但我想匹配所有不包含这种模式的内容。 我该怎么做呢?起初,我认为这样做符合你的要求。但由于下文@WiktorStribiżew提出的原因,它不起作用。特别是测试字符串,如AAAB和ABBC,应该与下面的匹配,但不匹配 我的第二个想法是使用 ^((\w)(\w)(?!\3\2)) 这似乎确实有效 新的测试程序。这将生成从AAAA到ZZZZ的所有可能字符串。然后使用非regexp检查来测试每个字符串是

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

((\w)(\w)\3\2)
它匹配所有包含安娜,奥托,xyyx

但我想匹配所有不包含这种模式的内容。
我该怎么做呢?

起初,我认为这样做符合你的要求。但由于下文@WiktorStribiżew提出的原因,它不起作用。特别是测试字符串,如AAAB和ABBC,应该与下面的匹配,但不匹配

我的第二个想法是使用

^((\w)(\w)(?!\3\2))
这似乎确实有效

新的测试程序。这将生成从AAAA到ZZZZ的所有可能字符串。然后使用非regexp检查来测试每个字符串是否匹配。最后,检查每个字符串是否符合两个正值

$findrepeats,
^(\w)(\w)(\3)(\2))
匹配abba

消极方面呢

$repeatnomatch
^((\w)(\w)(?!\3)(?!\2))
匹配ab[非b][非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

这个问题已经就此提出。你应该试试这个:

^((?!(\w)(\w)\3\2).)*$

取决于正则表达式的风格和您想做什么。请添加详细信息。正则表达式对于此类需求没有用处。您必须在编程语言中编写“不包含”代码,这比正则表达式“不包含”要简单得多。只需使用此模式拆分,然后使用string方法联接即可。这是不正确的。您认为什么时候执行
(?!\2)
?@WiktorStribiżew我猜它是从左到右计算的,因此先设置捕获组,然后再执行消极的前瞻断言。测试程序似乎如我所期望的那样工作,所以如果你能给我一些字符串,给出假阴性或阳性,它可能会帮助我进一步理解这一点。谢谢您的假设是正确的,但是如果您计划匹配
ab[not-b][not-a]
,这个正则表达式就不行了,因为lookaheads在
b
之后的同一个位置执行
(?!\2)
检查
b
后面的字符是否不是
a
。第四个字符可以是任意字符。@WiktorStribiżew好的,我已经找到了复制你所说内容的方法。如果我输入像“AAAB”
^((\w)(\w)(?!\3)(?!\2))这样的字符串,
不匹配,但应该匹配。我正在重写答案这只匹配不包含模式的整行/字符串,但不匹配模式的任何内容。OP没有要求任何与模式不匹配的内容,而是要求所有不包含模式的内容。在这种情况下,对事物的合理解释是直线,因此这个答案是完全正确的。
^((?!(\w)(\w)\3\2).)*$