Почему группа без захвата (? :), кажется, не работает? - PullRequest
8 голосов
/ 03 марта 2011
my $str='expire=0';

if ($str =~/expire\s*=\s* (?: 0[1-9]|[1-9][0-9])/){
    print " found it ";
}

не работает

Условие expire= должно сопровождаться числом между 1-99?

Ответы [ 3 ]

11 голосов
/ 03 марта 2011

В вашем регулярном выражении есть пробелы, удалите их:

/expire\s*=\s* (?: 0[1-9]|[1-9][0-9])/
              ^   ^ 

Также регулярное выражение 0[1-9]|[1-9][0-9] не соответствует 0.

РЕДАКТИРОВАТЬ:

Исходя из ваших комментариев, вы хотите разрешить число от 1-99 после expire=, чтобы вы могли использовать:

/^expire\s*=\s*(?:[1-9]|[1-9][0-9])$/

или более короткую версию:

/^expire\s*=\s*(?:[1-9][0-9]?)$/

Поскольку ваш пример имеет 0 после expire=, он не будет сопоставлен.

Также обратите внимание, что я добавил начальный и конечный якоря.Без них регулярное выражение может соответствовать любой допустимой подстроке ввода.Пример может соответствовать expire=99 во входных данных expire=999

6 голосов
/ 03 марта 2011

Если вы хотите использовать пробелы в своем регулярном выражении без их фактического совпадения с пробелами, вам нужно использовать модификатор x в своем регулярном выражении.Т.е. / foo /x соответствует строке "foo", а / foo / соответствует только "foo".

2 голосов
/ 03 марта 2011

У вас есть пробел между вторым \ s * и началом не захватывающей группы.Попробуйте вместо этого:

~/expire\s*=\s*(?:0[1-9]|[1-9][0-9])/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...