- Главная страница
- Разработка ПО
- О NTechnology
- База знаний
- NTechnology SIEM
- 15. Создание правил
- 15.1 Регулярные выражения
- Главная страница
- Разработка ПО
- О NTechnology
- База знаний
- NTechnology SIEM
- 15. Создание правил
- 15.1 Регулярные выражения
15.1 Регулярные выражения
Язык регулярных выражений (RegEx) – это формальный язык, используемый в компьютерных программах, работающих с текстом, для поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов. Для поиска используется строка-образец, состоящая из символов и метасимволов и задающая, правило поиска.
В системе регулярные выражения записываются в атрибут regex, существует 3 типа: regex (OS_Regex), sregex (OS_Match) and PCRE2.
1. Синтаксис регулярных выражений OS_Regex
Ограничения:
- Метасимволы "*" и "+" (таблица 3) можно применять только к выражениям с "\", а не к простым символам. Например, \d+ поддерживается. 0+ не поддерживается.
- Нельзя использовать чередование в группе. Например, (foo|bar).
- Сложный возврат не поддерживается. Например, \p*\d*\s*\w*: не соответствует ни одному двоеточию, поскольку "\p*" использует двоеточие.
- Нет синтаксиса для поиска символов "^", "*" или "+", вариант с использованием "\" для поиска данных символов невозможен. Обратите внимание, "\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 |
- Главная страница
- Разработка ПО
- О NTechnology
- База знаний
- NTechnology SIEM
- 15. Создание правил
- 15.1 Регулярные выражения
- Главная страница
- Разработка ПО
- О NTechnology
- База знаний
- NTechnology SIEM
- 15. Создание правил
- 15.1 Регулярные выражения
15.1 Регулярные выражения
Язык регулярных выражений (RegEx) – это формальный язык, используемый в компьютерных программах, работающих с текстом, для поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов. Для поиска используется строка-образец, состоящая из символов и метасимволов и задающая, правило поиска.
В системе регулярные выражения записываются в атрибут regex, существует 3 типа: regex (OS_Regex), sregex (OS_Match) and PCRE2.
1. Синтаксис регулярных выражений OS_Regex
Ограничения:
- Метасимволы "*" и "+" (таблица 3) можно применять только к выражениям с "\", а не к простым символам. Например, \d+ поддерживается. 0+ не поддерживается.
- Нельзя использовать чередование в группе. Например, (foo|bar).
- Сложный возврат не поддерживается. Например, \p*\d*\s*\w*: не соответствует ни одному двоеточию, поскольку "\p*" использует двоеточие.
- Нет синтаксиса для поиска символов "^", "*" или "+", вариант с использованием "\" для поиска данных символов невозможен. Обратите внимание, "\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 |