#php #regex #pcre
#php #регулярное выражение #pcre
Вопрос:
Мне нужно регулярное выражение PHP для определения шаблонов, таких как:
== Быстрый коричневый лис ==
Однако регулярное выражение не может совпадать:
=== Быстрый коричневый лис ===
У меня есть следующее регулярное выражение — я так близок:
={2}[a-zA-z0-9 ]*={2}
Ответ №1:
Используйте lookbehind до и lookahead после, вот так:
(?<=^|[^=])={2}[a-zA-z0-9 ]*={2}(?=$|[^=])
Редактировать: Хотя это решение работает, оно не так эффективно, как у Джастина.
Комментарии:
1. Этот вариант пока очень хорош. Вы выигрываете из-за скорости, @ridgerunner Я думаю, что есть несколько других вариантов, которые люди опубликовали, которые тоже будут работать. Я тоже попробую их. Спасибо за идеи для поиска в операторах lookahead и lookbehind.
2. Приветствую хорошее спортивное мастерство и 1, потому что ваш ответ по-прежнему правильный.
Ответ №2:
Похоже, это задание для поиска:
(?<!=)==[a-zA-z0-9 ]*==(?!=)
Я считаю, что приведенный выше способ сделать это наиболее удобочитаемым. Вы также можете использовать следующее, которое работает по существу таким же образом:
==(?<!={3})[a-zA-z0-9 ]*(?!={3})==
Это также позволит вам сопоставлять несколько раз в одной и той же строке, при условии, что между ними есть разрыв (любой не =
символ). Например, ==foo== ==bar==
должно привести к 2 совпадениям, в то время как ==foo====bar==
не должно привести ни к одному.
Комментарии:
1. Да, это решение с отрицательным внешним видом устраняет необходимость проверять начало и конец крайних значений строки, которые требуются в моем (низшем) ответе. Этот ответ следует выбрать как наилучший. 1
Ответ №3:
^={2}[a-zA-z0-9s] ={2}$
s
соответствует пробелу
^
обозначает начало
$
обозначают конец
Комментарии:
1. Вы также можете использовать [w s] в качестве символьного класса.
2. @erisco:
w
включает также другие символы в зависимости от настройки локали. Например, при использовании французской локали будут сопоставлены символы с ударением (могут быть желательными, а могут и не быть)…