Почему кажется, что регулярное выражение * в Perl не является жадным? - PullRequest
3 голосов
/ 13 июля 2009

Я ожидал, что это напечатает "[b]", но печатает "[]":

$x = "abc";
$x =~ /(b*)/;
print "[$1]";

Если звезда заменена на плюс, она действует так, как я ожидаю. Разве оба плюса и звезды не должны быть жадными?

ДОБАВЛЕНО: Спасибо всем за то, что указали (казалось, через несколько секунд), что "b *" соответствует пустой строке, первое вхождение которой происходит еще до того, как строка начинается. Так что жадность вообще не проблема. Это соответствует пустой строке, прежде чем даже добраться до первого 'b'.

Ответы [ 6 ]

10 голосов
/ 13 июля 2009

Жадный, но b* будет соответствовать пустой строке. что-нибудь * всегда будет соответствовать пустой строке, поэтому,

  "abc"
  /\
     --- matches the empty string here.

Если вы напечатаете $', вы увидите, что это abc, остальная часть строки после совпадения. Жадность просто означает, что в случае «bbb» вы получаете «bbb», а не «b» или «bb».

10 голосов
/ 13 июля 2009

Шаблон будет соответствовать и вернет первый раз, когда b* будет истиной, то есть будет выполнено сравнение с нулевой шириной при a. Чтобы более четко проиллюстрировать, что происходит, сделайте следующее:

$x = "zabc";
$x =~ /(.b*)/;
print "[$1]";
3 голосов
/ 13 июля 2009

Регулярное выражение совпадает с самой ранней точкой в ​​строке, которую оно может. В случае 'abc' = ~ / (b *) / эта точка находится в самом начале строки, где она может соответствовать нулю b. Если бы вы попытались сопоставить «bbc», вы бы напечатали:

[бб]

3 голосов
/ 13 июля 2009

Регулярное выражение будет соответствовать a(backtrack) (что является пустым значением, так как регулярное выражение отозвано) и закончится там. С квантификатором + он не соответствует a или c, поэтому значение $1 становится b.

1 голос
/ 05 августа 2009

Сравнение как можно раньше имеет более высокий приоритет, чем длина совпадения (AFAIR - это случай механизма сопоставления регулярных выражений Perl, который является NFA). Поэтому совпадение с нулевой длиной в начале строки является более желательным, чем более длинное совпадение в конце строки.

Для получения дополнительной информации ищите "DFA против NFA" в этой статье о механизмах сопоставления регулярных выражений.

0 голосов
/ 14 июля 2009

A * в конце шаблона почти всегда не то, что вы хотите. У нас даже есть вопрос с подвохом в Learning Perl , чтобы проиллюстрировать только эту проблему.

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