Сопоставление строки, содержащей ровно два символа «=» с обеих сторон

#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 включает также другие символы в зависимости от настройки локали. Например, при использовании французской локали будут сопоставлены символы с ударением (могут быть желательными, а могут и не быть)…