为什么这个正则表达式压制比我预期的要多?

时间:2011-01-28 13:49:56

标签: regex perl

我试图压制以[T 开头的字符串,而不进行正匹配并否定结果

my @tests = ("OT", "[T","NOT EXCLUDED");
foreach my $test (@tests)
{
 #match from start of string, 
 #include 'Not left sq bracket' then include 'Not capital T'
 if ($test =~ /^[^\[][^T]/)  #equivalent to /^[^\x5B][^T]/
 {
  print $test,"\n";
 }
}

输出

NOT EXCLUDED

我的问题是,有人可以告诉我为什么OT被排除在上面的例子中?

修改 感谢各位回复,我可以看到我有点屈膝。

4 个答案:

答案 0 :(得分:5)

正则表达式^[^\[][^T]匹配以[以外的字符开头的字符串,后跟T以外的字符。

由于OTT作为第二个字符,因此不匹配。

如果您想匹配除[T之外的任何字符串,您可以执行以下操作:

if ($test =~ /^(?!\[T)/) {
   print $test,"\n";
}

答案 1 :(得分:1)

YAPE::Regex::Explain可能会有所帮助:

$ perl -MYAPE::Regex::Explain -E 'say YAPE::Regex::Explain->new(qr/^[^\[][^T]/)->explain'
The regular expression:

(?-imsx:^[^\[][^T])

matches as follows:

NODE                     EXPLANATION
----------------------------------------------------------------------
(?-imsx:                 group, but do not capture (case-sensitive)
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  ^                        the beginning of the string
----------------------------------------------------------------------
  [^\[]                    any character except: '\['
----------------------------------------------------------------------
  [^T]                     any character except: 'T'
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------

答案 2 :(得分:0)

你的正则表达式转换为:

  

从输入开始,匹配除开放方括号( [)之外的任何内容,后跟除了大写字母T之外的任何内容

  • OT无法匹配
  • [T以及

答案 3 :(得分:0)

你的表达式相当于“以NOT开头[并且第二个不是T”,因此唯一通过的表达式不排除,因为在OT中,第二个字母是T