Я пытаюсь сопоставить последовательность символов в строке выделенных букв. Вот несколько примеров:PHP preg_match - regex неожиданно жадна
- "ABCDE"
- "ACCDE"
- "быть"
- "BCE"
- "EFG"
Я хочу, чтобы соответствовать что-нибудь с «e», но я также хочу получить два результата для обратных ссылок. Если найдено «b», это должна быть первая обратная связь, а вторая - между «b» и «e». Если нет «b», это не имеет большого значения, какова вторая обратная связь. Вот мой тестовый код:
$regex = "(b)?(.*)?? e ";
preg_match("/{$regex}/", " a b c d e ", $matches);
Это возвращает $ совпадений «» (ничего) и «a b c d». Тем не менее, он работает, как я хочу, чтобы, если я удалить пространство на передней панели:
preg_match("/{$regex}/", "a b c d e ", $matches);
Это возвращает $ матчи «б» и «в» г. Бинго! Но мне нужно это начальное пространство в строке стога сена. Я думал, что (б)? будет жадным из-за? в конце, и ожидал (. *) ?? быть ленивым. Но предпочитает ленивый (. *) ?? над ним.
Похоже, что первый приоритет регулярного выражения совпадает с началом строки, и только THEN считают жадность/лень. Это правда?
Адрес demo.
В реальном, не упрощенном регулярном выражении может быть несколько (b)? строки, и каждый из них на самом деле представляет собой сложное регулярное выражение, содержащее десятки символов, поэтому отрицание не будет возможным в (. *) ??.
Я действительно пытаюсь понять, что это - я хочу, чтобы и первая, и вторая группа были необязательными. Я хочу, чтобы первая группа была жадной, а вторая группа была неровной. В настоящее время вторая группа переопределяет первую, поскольку она может соответствовать ранее в строке.
Есть ли способ изменить регулярное выражение, чтобы выполнить то, что мне нужно?
Попробуйте '(\ sb) (. *) E'. Проверьте [Демо] (https://regex101.com/r/zQ2gO1/1) – Tushar
Это работает, если мы знаем, что есть «b», но он может быть не там. Я уточню вопрос более подробно. – Bonjiro
@Bonjiro Какое ваше ожидаемое совпадение для 'a a c c e f'? –