Regex Perl正则表达式否定

Regex Perl正则表达式否定,regex,perl,regex-negation,Regex,Perl,Regex Negation,如何对该正则表达式求反(不使用!~) 注意:abc、def或ghi前面或后面可以是字符串 if ( $Line =~ /^(?!.*(?:abc|def|ghi))/s ) { 也就是说,不可能在字符串开始后的任何地方匹配该模式。另一个选项可以是使用,除非而不是,如果: unless ($Line=~/(?:abc|def|ghi)/){printf("abc|def|ghi is not present\n");} else {printf("

如何对该正则表达式求反(不使用
!~

注意:abc、def或ghi前面或后面可以是字符串

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

也就是说,不可能在字符串开始后的任何地方匹配该模式。

另一个选项可以是使用
,除非
而不是
,如果

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

另一种方法是,这可能使您能够更好地控制各个组件子字符串

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

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

我很好奇您不想使用
的原因~。你能告诉我吗?因为我把正则表达式作为参数传递给一个子例程。把一个标志传递给表示负或正的子例程是一个更简单的解决方案。维护一个正则表达式/标志对的列表。一个小小的解释会非常有用:)你想要解释哪一部分?为什么我需要一个
^
?如果没有它,它将尝试匹配字符串中最后一个abc、def或ghi开头之后的某个地方,并成功(因为它不会匹配该点之后的任何部分)def和ghi
/^(?)*(?:abc))(?=*?def)(?=*?ghi)/s
如果您的意思是匹配任何不包含abc且包含def或ghi的字符串,
/^(?)*(?:abc))*(?:def | ghi)/s
 #  (?s)^(?:(?:(?!abc|def|ghi).)+|)$

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