【问题标题】:Perl regex negationPerl 正则表达式否定
【发布时间】:2013-11-26 23:05:07
【问题描述】:

如何否定这个正则表达式(不使用!~)?

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 可以在字符串之前或之后

【问题讨论】:

  • 我很好奇您不想使用!~ 的原因。你能告诉我吗?
  • 因为我将正则表达式作为参数传递给子例程。
  • 将标志传递给表示负数或正数的子将是一个更简单的解决方案。维护一个正则表达式/标志对列表。

标签: regex perl regex-negation


【解决方案1】:
if ( $Line =~ /^(?!.*(?:abc|def|ghi))/s ) {

也就是说,在字符串开头之后的任何地方都无法匹配该模式。

【讨论】:

  • 稍微解释一下会很有帮助:)
  • 您想解释哪一部分?
  • 为什么我需要^
  • 如果没有它,它会尝试匹配字符串中最后一个 abc、def 或 ghi 开始之后的某个位置,并成功(因为它不会匹配该点之后的任何一个)
  • def ghi? /^(?!.*?(?:abc))(?=.*?def)(?=.*?ghi)/s 如果你的意思是匹配任何不包含 abc 并且包含 def 或 ghi 的字符串,/^(?!.*?(?:abc)).*?(?:def|ghi)/s
【解决方案2】:

另一种方式,这可能会让您更好地控制各个组件子字符串

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

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

【讨论】:

    【解决方案3】:

    另一种选择是使用unless 而不是if

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

    【讨论】:

      猜你喜欢
      • 2011-09-24
      • 2013-07-23
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多