Почему это регулярное выражение подавляет больше, чем я ожидал? - PullRequest
1 голос
/ 28 января 2011

Я пытаюсь подавить строки, начинающиеся с [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 исключается в приведенном выше примере?

EDIT Спасибо всем за ваши ответы до сих пор, я вижу, что я был немного тупым.

Ответы [ 4 ]

5 голосов
/ 28 января 2011

Регулярное выражение ^[^\[][^T] соответствует строке, которая начинается с символа, отличного от [, за которым следует символ, отличный от T.

Поскольку OT имеет T в качестве 2-го символа, он не соответствует.

Если вы хотите сопоставить любую строку, кроме тех, которые начинаются с [T, вы можете сделать:

if ($test =~ /^(?!\[T)/) {
   print $test,"\n";
}
1 голос
/ 28 января 2011

YAPE :: Regex :: Объяснить может быть полезно:

$ 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
----------------------------------------------------------------------
0 голосов
/ 28 января 2011

Ваше выражение эквивалентно «начинается с NOT [, а второе - НЕ T», поэтому единственное, что проходит, НЕ ИСКЛЮЧЕНО, потому что в OT вторая буква - T

0 голосов
/ 28 января 2011

Ваше регулярное выражение переводится как:

С начала ввода сопоставьте что угодно, кроме открытой квадратной скобки ( [), за которой следует что угодно, кроме большой буквы T

  • OT не соответствует
  • [T также
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...