@reds

Как составить регулярное выражние?

Помогите составить регулярное выражение в php так, чтобы каждая буква из "к,о,л,е,с,о" могла быть использована 0 или 1 раз, то есть в массиве $slova должно найтись "колесо" и "оселок", а колосс не подходит, так как нет двух букв "с".

$slova = array ('колесо','колосс','оселок');

$poisk = preg_grep("/^((к|о|л|е|с|о)?){6}$/", $slova);

Как не меняю, оно ищет и колосс или ничего не ищет.

В массиве 10 тысяч слов, возможно есть более быстрый способ поиска, был бы благодарен, кроме foreach, пока все работает на нем, но хочу сравнить по скорости и удобности с регулярками.
  • Вопрос задан
  • 121 просмотр
Решения вопроса 1
@dodo512
Просто демонстрация возможностей библиотеки PCRE.
https://regex101.com/r/PUQP9o/3
https://rextester.com/XZMZK18309
$str = 'колесо';
$letters = preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY);

foreach ($letters as $i => &$letter) {
    $letter .= '(?!\\g' . ($i + 1) . ')()';
}

$regex = '#^(?:'.implode('|', $letters).')++$#u';

echo $regex, PHP_EOL;

$words = array ('колесо','колосс','оселок');

var_dump(preg_grep($regex, $words));
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
^(?:([еклс])(?!.*\1))*(?:о(?:([еклс])(?!.*\2))*){0,2}$

Референс: perlre.
Хочу обратить внимание, что регулярное выражение не является лучшим или просто читаемым решением указанной задачи.
Ответ написан
Комментировать
zkrvndm
@zkrvndm
Архитектор решений
Попробуй так:
$poisk = preg_grep("/[колесо][колесо][колесо][колесо][колесо][колесо]/", $slova);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы