Почему Perl игнорирует дополнительные символы в моем регулярном выражении? - PullRequest
1 голос
/ 23 ноября 2010

У меня есть эта строка в bash:

echo "a=-1"|perl -nle 'if (/.*=[0-9]*/){print;}'

и получите:

a=-1

Подождите ... Я не говорил, что Perl должен совпадать с -. Я сделал небольшое изменение:

echo "a=-1"|perl -nle 'if (/.*=[0-9]*$/){print;}'

и он правильно игнорирует строку. Почему?

Ответы [ 3 ]

6 голосов
/ 23 ноября 2010

Может оказаться полезным при разработке регулярного выражения выводить только ту часть строки, которой фактически соответствует регулярное выражение , а не всю строку.Это поможет вам лучше понять, что делает ваше регулярное выражение.Вы можете сделать это с помощью специальной переменной $&.Поэтому вместо:

echo "a=-1"|perl -nle 'if (/.*=[0-9]*/){print;}'

используйте

echo "a=-1"|perl -nle 'if (/.*=[0-9]*/){print $&;}'

Теперь вы получите другой вывод:

a=

И эта новая информация может дать вам преимущество впонимание того, как ваше регулярное выражение [неправильно] ведет себя в отношении входных данных.

5 голосов
/ 23 ноября 2010

[0-9] * может соответствовать пустой строке.Когда вы привязались к концу строки, вы предотвратили это пустое совпадение.

Вы, вероятно, хотите сказать [0-9] +, чтобы означать «хотя бы одну цифру».

5 голосов
/ 23 ноября 2010

В первом примере вы говорите, что [0-9] может произойти «*» раз, что означает ноль или более (поэтому он соответствует только «=». Когда вы добавили «$», он больше не соответствует, потому что онне заканчивается после [0-9].

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