Повторяющиеся символы регулярного выражения Php [используйте символы с максимальным повторением]

#php #regex

#php #регулярное выражение

Вопрос:

У меня есть строка, подобная этой:

 "ABCCCCCCCCCCCCCDEF"
  

я использую код

 $value=preg_replace('/[C]{3,}/',"Z",$value);
  

верните это

 "ABZZZZCDEF"
  

Как я могу получить следующий результат?

 "ABZCDEF"
  

Комментарии:

1. Для меня он возвращает «ABZDEF» . CodePad .

2. Какую версию PHP вы используете?

3. Пожалуйста, покажите фактический код, который вы используете, а не упрощенный пример. И, возможно, объясните, в чем цель этого кода. Я получаю результат, который вы видите при использовании /C{3}/ в качестве регулярного выражения поиска.

Ответ №1:

 <?php
$a = "ABCCCCCCCCCCCCCDEF";
echo preg_replace('/[C] /', 'ZC', $a);
?>
  

Дает

 ABZCDEF
  

Ответ №2:

Я думаю, это то, что вы ищете:

 $value = preg_replace('/([C]{3}) /', "Z", $value);
  

…или «Замените одну или несколько групп из трех C на a» Z . Опубликованный вами код работает не так, как вы говорите. Я подозреваю, что, как предположил Тим, вы действительно это делаете:

 $value = preg_replace('/[C]{3}/', "Z", $value);
  

Обратите внимание на отсутствие запятой ( , ). Это заменяет каждую группу из трех C на a Z , где моя версия заменяет все группы из трех C на единицу Z .

РЕДАКТИРОВАТЬ: … или, как предположил Марио, вы действительно выполняете не жадное совпадение. В этом случае ваша строка «регулярного выражения» будет '/[C]{3,}?/' или '/[C]{3,}/U' .

Ответ №3:

preg_replace Кажется, что по умолчанию у вас значение ungreedy . В этом случае вы можете изменить {3,} квантификатор на дополнительный , чтобы он означал минимум 3 символа:

  = preg_replace('/[C]{3,} /',
  

Комментарии:

1. Это уже означает минимум три символа. Единственное делает квантификатор притяжательным, в данном случае вообще не изменяя результат.

2. Тим прав, если сделать квантификатор притяжательным, это не изменит его жадность, это просто отключит отслеживание назад. Это означает, что жадный квантификатор всегда будет принимать максимум, а нежадный всегда будет принимать минимум, даже если это делает невозможным полное совпадение.

3. @AlanMoore: Мы уже заметили, что Тим прав. Однако номенклатура не слишком важна для практического результата.

4. Я хочу сказать, что номенклатура важна, тем более что все три явления были неправильно названы с самого начала. Жадные кванторы должны были быть названы нетерпеливыми , нежадные лучше описать как неохотные , а притяжательные кванторы действительно жесткие . 😉 Хорошо, может быть, жестко — но «притяжательный» слишком легко интерпретировать как «более жадный», что полностью упускает суть.