2015-01-16 5 views
1

Regex: (simple|complex)
Текст: using simple with key value pairs using complex with key value pairs using simple with key value pairsRegex только один Чередование

Есть ли способ, чтобы соответствовать только один раз значение simple, если он используется, а не в два раза?

+0

не использовать глобальный модификатор, или '^ (? :(?! \ bsimple \ b | \ bcomplex \ b).) * \ K (?: simple | complex) 'https://regex101.com/r/sY6eW6/3 –

+0

Не могли бы вы объяснить это? Есть ли способ совпадения только один раз простое значение, если оно используется, а не два раза? ' –

+0

Вы хотите сказать, что для успешного сопоставления строка должна иметь только одно вхождение' simple' и только одно вхождение 'complex'? Если это так, вы можете использовать: '^ (? = (? :(?! просто).) *? (?: simple) (? :(?! просто).) * $) (? =^(? :(? !) *? (?: complex) (? :(?! complex).) * $). *? $ ' – JonM

ответ

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' 
      ] 
     ]; 

Глобальный модификатор не установлен, и оба «комплекс» и «простой» обнаружены правильно. Если первая строка является «простой», то это сообщается на ее собственной, даже если присутствует строка «complex».

0

Следующее выражение будет соответствовать только строки, которые имеют либо simple или complex в них, но только тогда, когда либо появляется только один раз:

^(?=(?:(?!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).)*?$|$)) линия может иметь только один или не возникновение простого
  • (?=(?:(?!complex).)*?(?:(?:complex)(?:(?!complex).)*?$|$)) линия может иметь только один или не возникновение сложных
+2

Это кажется слишком сложным. '^ (?!. * simple. * simple |. * complex. * complex). * (простой | complex). *' будет делать то же самое. –

+0

@TimPietzcker Спасибо, гораздо легче читать и гораздо эффективнее – JonM

Смежные вопросы