Что означают + и * в регулярных выражениях? - PullRequest
1 голос
/ 31 марта 2009

Я получил ответ на свой вопрос здесь: Как узнать, является ли файл разделением табуляции или пробелом в Perl?

но мне бы очень помогло, если бы кто-нибудь смог разобрать регулярное выражение и объяснить, что происходит и почему оно не работает в последней строке файла.

~/^(\d+\s+)+?$/

Я думал, что выше было '+' в обратной стороне, поэтому, если я добавлю '*', это будет работать, потому что * означает ноль или более ... но это не сработало

Ответы [ 2 ]

3 голосов
/ 31 марта 2009
Regex: /^(\d+\s+)+?$/
Parts:  1  2  3  456
  1. Матч с начала строки
  2. Найти одно или несколько чисел
  3. После одного или нескольких пробелов (или табуляций)
  4. Найти один или несколько из 2 и 3
  5. Но не будьте жадными в этом матче (то есть останавливайтесь, когда можете, не продолжайте, пока не сможете)
  6. Соответствует концу строки.

Должен совпадать со строкой из целой строки пробелов или чисел, разделенных табуляцией. Я не совсем уверен, почему в последней строке произойдет сбой ... возможно, в конце нет пробела? Поскольку за каждым номером должен следовать хотя бы один пробел, это может быть и оно.

0 голосов
/ 31 марта 2009

На самом деле исходное регулярное выражение не принимает пустые строки, поэтому, вероятно, оно не работает с последней строкой вашего файла (ссылка на файл примера была бы полезной) Это должно выглядеть так:

perl -ne 'if ($_=~/^(\d+\s+)*$/){print "yep\n";}'

Другим способом может быть проверка всех символов на наличие пробелов или цифр.

Принимая пустые строки:

perl -ne 'if ($_=~/^[\s\d]*$/){print "yep\n";}'

Когда не принимаются пустые строки:

perl -ne 'if ($_=~/^[\s\d]+$/){print "yep\n";}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...