facebook

15.1 Регулярные выражения

Язык регулярных выражений (RegEx) – это формальный язык, используемый в компьютерных программах, работающих с текстом, для поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов. Для поиска используется строка-образец, состоящая из символов и метасимволов и задающая, правило поиска. 

В системе регулярные выражения записываются в атрибут regex, существует 3 типа: regex (OS_Regex), sregex (OS_Match) and PCRE2.

1. Синтаксис регулярных выражений OS_Regex

Ограничения:

  1. Метасимволы "*" и "+"  (таблица 3) можно применять только к выражениям с "\", а не к простым символам. Например, \d+ поддерживается. 0+ не поддерживается.
  2. Нельзя использовать чередование в группе. Например, (foo|bar).
  3. Сложный возврат не поддерживается.  Например, \p*\d*\s*\w*: не соответствует ни одному двоеточию, поскольку "\p*" использует двоеточие.
  4. Нет синтаксиса для поиска символов "^", "*" или "+", вариант с использованием "\" для поиска данных символов  невозможен. Обратите внимание, "\p" будет соответствовать "*" или "+", а также некоторым другим символам (таблица 2).

    

Таблица 2 – Синтаксис OS_Regex, представления

Представление
\w
Эквивалент
[A-Za-z0-9],[-,@,_]
Значение
Символы, образующие "слово"
Представление
\d
Эквивалент
[0-9]
Значение
Цифра
Представление
\s
Эквивалент
Пробел
Значение
Соответствует только пробелу ASCII (32), а не другим пробелам, например, табуляции
Представление
\t
Эквивалент
TAB
Значение
Представление
\p
Эквивалент
()*+,-.:;<=>?[]!"'#$%&|{}
Значение
Представление
\W
Эквивалент
[^\w]
Значение
Символы, не образующие "слово"
Представление
\D
Эквивалент
[^\d]
Значение
Любой символ, кроме цифры
Представление
\S
Эквивалент
[^\s]
Значение
Любой символ, кроме пробела

   

Таблица 3 – Синтаксис OS_Regex, метасимволы

Метасимвол
\.
Описание
Соответствует любому символу
Примеры
a.b – найдет любой символ между, например «abc»,« a-b», «a2b»
Метасимвол
.
Описание
Соответствует точке
Примеры
example. – найдет «example.xml», «example.csv»
Метасимвол
^
Описание
Для обозначения начала строки
Примеры
^[а-я] – абзац, начинающийся со строчной буквы
Метасимвол
$
Описание
Для обозначения конца строки
Примеры
^$ – пустая строка
Метасимвол
[]
Описание
Набор символов
Примеры
0x[0a-c] – числа, начинающиеся с 0×0, 0xa, 0xb или 0xc
Метасимвол
|
Описание
Для создания логического "или" между несколькими выражениями
Примеры
рабоч(его|ее) – ищем «рабочего» или «рабочее»
Метасимвол
*
Описание
Для совпадения 0 или более раз
Примеры
^.* – выделение строк (пустых и не пустых)
Метасимвол
+
Описание
Для совпадения 1 или более раз
Примеры
^.+ – выделение непустых строк (абзацев)
Метасимвол
\
Описание
Для того, чтобы искать символ, совпадающий с метасимволом, его необходимо отделить обратной косой чертой
Примеры
\$     \(     \)     \\     \|     \<

      

2. Синтаксис регулярных выражений SRegex (OS_Match)

Данный тип регулярных выражений обрабатывается быстрее, но поддерживает только простое сопоставление строк и некоторые специальные метасимволы (таблица 4).

   

Таблица 4 – Синтаксис OS_Match, метасимволы

Метасимвол
^
Описание
Для обозначения начала строки
Примеры
^example – текст начинается с данного выражения
Метасимвол
$
Описание
Для обозначения конца строки
Примеры
example$ – конец текста заканчивается на данное выражение
Метасимвол
|
Описание
Для создания логического "или" между несколькими выражениями
Примеры
example|test - найдет "example" или "test", или и то, и то
Метасимвол
!
Описание
Для отрицания, исключения выражения
Примеры
!example - найдет все, кроме "example"

     

3. Синтаксис регулярных выражений PCRE2

Perl Compatible Regular Expressions (далее – PCRE) предоставляет такие функции, как рекурсивные шаблоны, утверждения просмотра вперед и назад, группы без захвата, нежадные квантификаторы, расширенный синтаксис для метасимволов и классов метасимволов и многие другие (таблица 5-8).

    

Таблица 5 – Синтаксис PCRE, представления

Представление
\w
Эквивалент
[A-Za-z0-9],[ -, @, _] 
Значение
Символы, образующие "слово"
Представление
\d
Эквивалент
[0-9]
Значение
Цифра
Представление
\h
Эквивалент
Любой горизонтальный пробельный символ
Значение
Представление
\s
Эквивалент
[\t\r\n\f]
Значение
Любой пробельный символ
Представление
\p
Эквивалент
()*+,-.:;<=>?[]!"'#$%&|{}
Значение
Представление
\S
Эквивалент
[ ^\s]
Значение
Любой символ, кроме пробела
Представление
\W
Эквивалент
[ ^\w]
Значение
Символы, не образующие "слово"
Представление
\D
Эквивалент
[ ^\d]
Значение
Любой символ, кроме цифры
Представление
\H
Эквивалент
[ ^\h]
Значение
Любой символ, кроме /h

В синтаксисе PCRE есть метасимволы – специальные символы, которые используются для составления шаблонов и определений правил поиска.

    

Таблица 6 – Синтаксис PCRE, метасимволы

Метасимволы
.
Описание
Соответствует любому символу, кроме новой строки
Параметры
Символы, образующие "слово"
Метасимволы
^
Описание
Для обозначения начала строки
Параметры
^[a-я] - абзац, начинающийся со строчной буквы
Метасимволы
$
Описание
Для обозначения конца строки
Параметры
^$ - пустая строка
Метасимволы
[]
Описание
Набор символов
Параметры
0x[a-я] - абзац, начинающийся со строчной буквы
Метасимволы
()
Описание
Группировка
Параметры
Метасимволы
|
Описание
Для создания логического "или" между несколькими выражениями
Параметры
Любой символ, кроме пробела
Метасимволы
\
Описание
Для того, чтобы искать символ, совпадающий с метасимволом, его необходимо отделить обратной косой чертой
Параметры
\$ \( \) \\ \| \<

Метасимволы имеют квантификаторы (пишутся после метасимвола). Они могут быть greedy («жадными»), possessive («промежуточный, между жадный и ленивый»), lazy («ленивый»).

     

Таблица 7 – Синтаксис PCRE, метасимволы

Квантификаторы
?
Описание
Повторяется 1 или 0 раз
Качество
greedy
Квантификаторы
?+
Описание
Повторяется 0 или 1 раз
Качество
possesive
Квантификаторы
??
Описание
Повторяется 0 или 1 раз
Качество
Квантификаторы
*
Описание
Повторяется  0 или более раз
Качество
greedy
Квантификаторы
*+
Описание
Повторяется  0 или более раз
Качество
possesive
Квантификаторы
*?
Описание
Повторяется  0 или более раз
Качество
lazy
Квантификаторы
+
Описание
Повторяется  1 или более раз
Качество
greedy
Квантификаторы
++
Описание
Повторяется  1 или более раз
Качество
possesive
Квантификаторы
+?
Описание
Повторяется  1 или более раз
Качество
lazy
Квантификаторы
{n}
Описание
Повторяется  точное n раз
Качество
Квантификаторы
{n,m}
Описание
Как минимум n раз, не более чем m раз
Качество
greedy
Квантификаторы
{n,m}+
Описание
Как минимум n раз, не более чем m раз
Качество
possesive
Квантификаторы
{n,m}?
Описание
Как минимум n раз, не более чем m раз
Качество
lazy
Квантификаторы
{n, }
Описание
По меньшей мере  1 раз
Качество
greedy
Квантификаторы
{n, }+
Описание
Повторяется  n или более раз
Качество
possesive
Квантификаторы
{n, }?
Описание
Повторяется  n или более раз
Качество
lazy

«Жадный» (greedy). Квантификатор сопоставляет с максимальным количеством символов, удовлетворяющих шаблону, и пытается расширить свою область до максимальной длины, при этом все еще удовлетворяя шаблону.

Например, в выражении .*foo, .* сначала «поглощает» всю входную строку. Затем, если общее выражение не может выполниться, поскольку последние три буквы («f», «o», «o») уже были «поглощены», то сопоставитель медленно отступает на одну букву за раз, пока не найдет правое вхождение «foo».

«Неохотные» (Lazy или Reluctant). Квантификатор сопоставляет с наименьшим количеством символов, удовлетворяющих шаблону, и расширяет свою область только при необходимости удовлетворения остальной части шаблона. Таким образом, он предпочитает минимальное количество символов, чтобы шаблон все еще был совместимым.

Например, в выражении .*?foo, .*? начинает с «поглощения» ничего. Поскольку «foo» не стоит в начале строки, он вынужден «поглотить» первую букву (например, «x»), что вызывает первое совпадение.

«Промежуточные» (Possessive). Квантификатор сопоставляет с максимальным количеством символов, удовлетворяющих шаблону, и отказывается от дополнительных попыток, чтобы дать другим частям шаблона возможность сопоставить. Это полезно в случаях, когда дополнительные попытки не приведут к положительному результату, так как шаблон уже находится в пределах своего допустимого диапазона.

Например, в выражении .*+foo, .*+ «поглощает» всю входную строку, не оставляя ничего для “foo” в конце выражения. Это выражение не найдет совпадение.

  

Таблица 8 – Синтаксис PCRE, иные символы и выражения

Символы
\f
Описание
Подача страницы (шестнадцатеричный 0C)
Символы
\n
Описание
Новая строка
Символы
\r
Описание
Возврат каретки
Символы
\t
Описание
Табуляция
Символы
\0dd
Описание
Символ с восьмеричным кодом 0dd
Символы
\0{ddd.. }
Описание
Символ с восьмеричным кодом ddd
Символы
\xhh
Описание
Символ с шестнадцатеричным кодом hh
Символы
\x{hh.. }
Описание
Символ с шестнадцатеричным кодом hh