Что не так с этим шаблоном сопоставления perl? - PullRequest
2 голосов
/ 22 декабря 2010

Для ловушки svn precommit я хочу зачеркнуть начальные пробелы (там, безусловно, нет вкладок) в строках с определенными ключевыми словами в них, прежде чем фиксировать их на сервере. Например строка

    MACRO_1 (ABC, "Some String");

должны быть сопоставлены, а начальные пробелы перед MACRO_1 должны быть удалены. В настоящее время у меня есть следующее выражение для соответствия:

   if($line =~ /^\s+MACRO_1|MACRO_2|MACRO_3|MACRO_4.*/) {
     print "Stripping leading space on line $line\n";
     $line =~ s/^\s*//gsxm;   # strip leading spaces
   }

Когда я смотрю на консоль, я получаю следующий вывод:

Stripping leading space on line MACRO_1;
Stripping leading space on line MACRO_2;
Stripping leading space on line     MACRO_3 (ABC, "Some String");
Stripping leading space on line  MACRO_1;
Stripping leading space on line MACRO_2;
Stripping leading space on line MACRO_1(123);
Stripping leading space on line MACRO_2(123);
Stripping leading space on line             MACRO_1;
Stripping leading space on line MACRO_2;
Stripping leading space on line MACRO_1;

Меня это немного смущает, поскольку есть строки без начального пробела, которые, как я думал, не будут совпадать с \s+, что, на мой взгляд, один или несколько пробелов .

В чем проблема?

1 Ответ

10 голосов
/ 22 декабря 2010

| имеет самый низкий приоритет среди операторов регулярных выражений.

Итак, неправильное регулярное выражение для соответствия строке, содержащей только foo или только bar:

^foo|bar$

потому что это будет рассматриваться как:

(^foo)|(bar$)

соответствует любой строке, начинающейся с foo или заканчивающейся bar; так что это соответствует например foo1 и 1bar.

Правильное регулярное выражение будет ^(?:foo|bar)$

Точно так же в вашем случае правильное регулярное выражение:

if($line =~ /^\s+(?:MACRO_1|MACRO_2|MACRO_3|MACRO_4).*/) {

Также обратите внимание, что трейлинг не нужен .*.

Вы можете сократить свое регулярное выражение как:

if($line =~ /^\s+MACRO_[1-4]/) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...