Почему в этом регулярном выражении сопоставляются пустые строки? - PullRequest
1 голос
/ 20 мая 2009

G'day,

Я использую следующий фрагмент Perl для извлечения выходных данных из команды кластера Solaris.

open(CL,"$clrg status |");
my @clrg= grep /^[[:lower:][:space:]]+/,<CL>;
close(CL);

При печати содержимого элементов массива @clrg BTW я получаю следующее: «=>» и «

=><=
=>nas-rg             mcs0.cwwtf.bbc.co.uk   No          Online<=
=>                   mcs1.cwwtf.bbc.co.uk   No          Offline<=
=><=
=>apache-rg          mcs0.cwwtf.bbc.co.uk   No          Online<=
=>                   mcs1.cwwtf.bbc.co.uk   No          Offline<=
=><=

Когда я заменяю его следующим фрагментом Perl, пустые строки не совпадают.

open(CL,"$clrg status |");
my @clrg= grep /^[[:lower:][:space:]]{3,}/,<CL>;
close(CL);

И я получаю следующее:

=>nas-rg             mcs0.cwwtf.bbc.co.uk   No          Online<=
=>                   mcs1.cwwtf.bbc.co.uk   No          Offline<=
=>apache-rg          mcs0.cwwtf.bbc.co.uk   No          Online<=
=>                   mcs1.cwwtf.bbc.co.uk   No          Offline<=

Простой вопрос: почему?

Кстати, использование {1,} во втором фрагменте Perl также соответствует пустым строкам!

Любые предложения с благодарностью приняты!

ура

Ответы [ 2 ]

9 голосов
/ 20 мая 2009

Это будет потому, что [:space:] соответствует переводу строки и возврату каретки.

То есть [[:space:]]+ будет соответствовать \n, \r\n или \n\n.

Но для [[:space:]]{3,} потребуется три символа, а пустая строка - это просто \n.

{1,} и + означают одно и то же: соответствуют предыдущей группе один или несколько раз.

P.S. Типичный символ новой строки - \n в Unix и \r\n в Windows.

1 голос
/ 20 мая 2009

Hm. Согласно документации регулярного выражения *1001* Perl, класс символов [:space:] не должен включать перевод строки, поскольку предполагается, что он эквивалентен \s (за исключением того, что он распознает дополнительный символ поддерживать соответствие POSIX).

Однако , только что проверив это на 5.10.0, я могу убедиться, что он также соответствует символам новой строки. Будь это ошибка в Perl или в документации, я оставлю его сопровождающим. Но чтобы избежать немедленной проблемы, используйте решение предыдущего ответчика и просто используйте \s вместо класса POSIX.

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