Странный результат использования звездочки * квантификатор - PullRequest
0 голосов
/ 29 января 2019

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

<code><?php
$x = 'ab';

preg_match_all("/a*/",$x,$m);
echo '<pre>';
var_dump($m);
echo '
';?>

результат получился:

 array(1) {
  [0]=>
    array(3) {
     [0]=> string(1) "a"
     [1]=> string(0) ""
     [2]=> string(0) ""
    }
 }

Насколько я понимаю, он сначала соответствовал a, а затем ничего не соответствовало, когда b, поэтому результат должен быть

  array(1) {
  [0]=>
    array(2) {
     [0]=> string(1) "a"
     [1]=> string(0) ""
    }
 }

Так что же такое третий матч?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Ваше регулярное выражение '/ a / *' Соответствует нулю ( пусто ) или более последовательных a символов.

Пример: если вы пытаетесь сопоставить'/ a * /' для пустой строки возвращает одно совпадение, потому что * ссылаются ни на что или больше. см. Здесь

preg_match_all продолжает поиск до завершения обработки всей строки.Как только совпадение найдено, оно пропускает строку, чтобы попытаться применить другое совпадение.

0 голосов
/ 29 января 2019

Используя демонстрационный инструмент регулярных выражений здесь , мы можем видеть, что первое совпадение равно a, а второе и третье совпадения являются разделителями нулевой ширины между a и b,а также между b и концом строки.

Имейте в виду, что поведение preg_match_all состоит в том, чтобы повторно брать шаблон a* и пытаться применять его последовательно ко всей входной строке.

Я подозреваю, что вы действительно хотите использовать здесь a+.Если вы посмотрите это второе демо , вы увидите, что с a+ мы получаем только одно совпадение, для одной буквы a в ab.Итак, я голосую за использование a+ здесь для решения вашей проблемы.

...