«Глаголы» в PCRE

В известной библиотеке «PCRE», реализующей Перл-подобные регулярные выражения, есть такая штука как «глаголы» (в оригинале — VERB). Это ключевые слова, указывающиеся в скобках и начинающиеся со звёздочки. Когда-то я рассказывал об одном из них — «глаголе» UCP, который позволяет полноценно использовать ЮТФ-8 в этой библиотеке.

Но есть и другие, на самом деле их довольно много, причём их применение очень разнообразно. Мне редко ими приходится пользоваться, вероятно по той причине, что я всё реже пользуюсь регулярными выражениями вообще. Впрочем, смотря с чем сравнивать.

Самые популярные «глаголы» в моём рационе (если исключить UCP), это — ACCEPT и FAIL. Сейчас на небольших примерах из документации расскажу что это.

«Глагол» ACCEPT даёт понять библиотеке, что дальше можно не искать — найденное нас устроило. Вот смотрите:
A((?:A|B(*ACCEPT)|C)D)
Если подставить в эту регулярку «ACD», то ничего необычного не произойдёт: совпадение выглядит ожидаемым способом:  A((?:A|B(*ACCEPT)|C)D), выглядит так, как будто строка для проверки всегда обязана заканчиваться на «D», по если передать сюда «AB», то совпадение тоже будет: A((?:A|B(*ACCEPT)|C)D) — «глагол» ACCEPT говорит о том, что дальше можно не продолжать, остаток нас не интересует.

«Глагол» FAIL позволяет достичь ровно противоположного и, в частности, сформировать отрицание, которое другими средствами добиться тяжелее и представляет сложность для новичков в регулярках.
A(?:BCD(*FAIL)|.*?)E
Если передать сюда строки «ABCE», «AEEE», «AwhateverE» совпадение произойдёт по следующим правилам шаблона: A(?:BCD(*FAIL)|.*?)E, но если передать «ABCDE», то совпадения не будет, вступит в силу «глагол» FAIL: A(?:BCD(*FAIL)|.*?)E.

Эти и другие «глаголы» (кроме MARK) отлично работают в ПХП, потому что фукнции «preg_*» как раз используют библиотеку PCRE у себя внутри.
27 ноября 2014 09:24

indeec17 (инкогнито)
29 ноября 2014, 23:26

спасибо! не знал об отрицании, да и о глаголах, но наконец-то!

Евгений Степанищев (bolknote.ru)
30 ноября 2014, 10:00, ответ предназначен indeec17

Ну, отрицание по-другому можно было делать :) Но так проще.

Паша (инкогнито)
1 декабря 2014, 05:11

Трансляция в LJ/RSS похоже поломалась, последняя запись за 12 октября - http://bolk-rss.livejournal.com

Евгений Степанищев (bolknote.ru)
1 декабря 2014, 07:20, ответ предназначен Паше

Я её, к сожалению, не настраиваю и вообще к ней отношения не имею. Там даже ошибка странная — написано, что транслируется с bolknote.ru, а ошибка — не может соединиться с bolk.exler.ru (это древний адрес этого сайта).

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)