2013-11-26 36 views
2

如何否定此正則表達式(不使用!~)?Perl正則表達式否定

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"); 
} 

注:ABC,DEF或GHI可之前或字符串

+1

我很好奇的原因更多的控件你不想使用'!〜'。你會告訴我嗎? – Birei

+0

因爲我將正則表達式作爲參數傳遞給子例程。 – Jean

+0

這將是一個更簡單的解決方案,通過一個標誌的子表示負面或積極的。保持正則表達式/標誌對的列表。 – 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 
      ) 
      . 
    )+ 
    | 
) 
$