2013-11-26 2 views
2

Как отменить это регулярное выражение (без использования !~)?Perl regex negation

my $Line='pqr_abc_def_ghi_xyz'; 

if ($Line=~/(?:abc|def|ghi)/) 
{ 
    printf("abc|def|ghi is not present\n"); 
} 
else 
{ 
    printf("abc|def|ghi is present\n"); 
} 

Примечание: азбука, четкости или ГХИ может предшествовать или наследовал строки

+1

Мне любопытно той причине, что вы не хотите использовать '! ~'. Вы скажете мне? – Birei

+0

Потому что я передаю регулярное выражение как аргумент подпрограммы. – Jean

+0

Это было бы более простым решением передать флаг в суб, обозначающий отрицательный или положительный. Ведение списка пар regex/flags. – sln

ответ

5
if ($Line =~ /^(?!.*(?:abc|def|ghi))/s) { 

есть, это не представляется возможным, чтобы соответствовать этому шаблону в любом месте после начала строки.

+0

Немного объяснений было бы очень полезно :) – Jean

+0

какой части вы хотели бы объяснить? – ysth

+0

Зачем мне нужен '^'? – Jean

1

Другим вариантом может быть использование unless вместо if:

unless ($Line=~/(?:abc|def|ghi)/){printf("abc|def|ghi is not present\n");} 
else       {printf("abc|def|ghi is present\n");} 
2

Другой способ, это может дать вам больше контроля отдельных компонентов подстрок

# (?s)^(?:(?:(?!abc|def|ghi).)+|)$ 

(?s) 
^ 
(?: 
     (?: 
      (?! 
       abc 
      | def 
      | ghi 
      ) 
      . 
    )+ 
    | 
) 
$