正则表达式只有一个交替

时间:2015-01-16 10:02:31

标签: regex

正则表达式:(simple|complex)
文字:using simple with key value pairs using complex with key value pairs using simple with key value pairs

如果使用了simple值,是否有任何方式只匹配一次,而不是两次?

2 个答案:

答案 0 :(得分:0)

#!/usr/bin/perl
#
use Data::Dumper;

my @ex=qw(simple complex simplycomplex complexcomplexbutsimple simplebutcomplex);

sub runexamples {
  my $qr=shift;
  my @matches;
  for my $example (@ex) {
    push @matches, [($example =~ /$qr/)];
  }
  return \@matches;
}

print Dumper(runexamples(qr/(complex|simple)/));

此程序如果运行产生以下输出

$VAR1 = [
          [
            'simple'
          ],
          [
            'complex'
          ],
          [
            'complex'
          ],
          [
            'complex'
          ],
          [
            'simple'
          ]
        ];

未设置全局修饰符且两者都复杂"和"简单"被正确检测到。如果第一个字符串是"简单"然后,即使字符串"复杂"也在场。

答案 1 :(得分:0)

以下表达式仅匹配其中包含simplecomplex的行,但仅限于仅出现一次的行:

^(?=(?:(?!simple).)*?(?:(?:simple)(?:(?!simple).)*?$|$))(?=.*?(?:simple|complex))(?=(?:(?!complex).)*?(?:(?:complex)(?:(?!complex).)*?$|$)).*?$

确保表达式处于多行模式,无论您使用什么来实现此目的(大多数情况下默认为多行模式)。

匹配

using simple with complex here
eggs are both complex and simple all at once
simple
complex
some simple things
some complex things

不匹配:

this is irrelevant 
eggs are both complex and simple all at once said simple simon
simple simple
complex complex

表达式可以分为三个要求:

  • (?=.*?(?:simple|complex))该行必须包含' simple'或者'复杂'
  • (?=(?:(?!simple).)*?(?:(?:simple)(?:(?!simple).)*?$|$))该行只能出现一次或不出现简单
  • (?=(?:(?!complex).)*?(?:(?:complex)(?:(?!complex).)*?$|$))该行只能出现一次或不出现复杂的