Синтаксис regex
Область применения: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
В этой статье представлен обзор синтаксиса регулярных выражений, поддерживаемых язык запросов Kusto (KQL).
Существует ряд операторов и функций KQL, которые выполняют сопоставление строк, выделение и извлечение с регулярными выражениями, например matches regex
, parse
и replace_regex()
.
В KQL регулярные выражения должны быть закодированы как строковые литералы и следовать правилам кворирования строк. Например, регулярное выражение \A
представлено в KQL как "\\A"
. Дополнительная обратная косая черта указывает, что другая обратная косая черта является частью регулярного выражения \A
.
Синтаксис
В следующих разделах описан синтаксис регулярных выражений, поддерживаемый Kusto.
Совпадение с одним символом
Расписание | Description |
---|---|
. |
Любой символ, кроме новой строки (включает новую строку с флагом s) |
[0-9] |
Любая цифра ASCII |
\d |
Цифра (\p{Nd} ) |
\D |
Не цифра |
\pX |
Класс символов Юникода, идентифицируемый по имени однобуквенный |
\p{Greek} |
Класс символов Юникода (общая категория или скрипт) |
\PX |
Класс символов Юникода отрицается по имени однобуквенного |
\P{Greek} |
Отрицание класса символов Юникода (общая категория или скрипт) |
Категории знаков
Расписание | Description |
---|---|
[xyz] |
Класс символов, соответствующий x, y или z (union). |
[^xyz] |
Класс символов, соответствующий любому символу, кроме x, y и z. |
[a-z] |
Класс символов, соответствующий любому символу в диапазоне a-z. |
[[:alpha:]] |
Класс символов ASCII ([A-Za-z]) |
[[:^alpha:]] |
Отрицание класса символов ASCII ([^A-Za-z]) |
[x[^xyz]] |
Класс символов вложенного или группирования (соответствующий любому символу, кроме y и z) |
[a-y&&xyz] |
Пересечение (сопоставление x или y) |
[0-9&&[^4]] |
Вычитание с помощью пересечения и отрицания (соответствует 0-9, кроме 4) |
[0-9--4] |
Прямая вычитание (сопоставление 0-9, кроме 4) |
[a-g~~b-h] |
Симметричное различие (сопоставление a и h только) |
[\[\]] |
Escape в классах символов (сопоставление [ или ]) |
[a&&b] |
Пустой класс символов, соответствующий ничего не |
Примечание.
Любой именованный класс символов может отображаться в скобках класса символов [...]
. Например, [\p{Greek}[:digit:]]
соответствует любой цифре ASCII или любой точке кода в скрипте Greek
. [\p{Greek}&&\pL]
соответствует греческим буквам.
Приоритет в классах символов — от большинства привязок к наименьшей привязке:
- Диапазоны:
[a-cd]
==[[a-c]d]
- Союз:
[ab&&bc]
==[[ab]&&[bc]]
- Пересечение, разница, симметричная разница: все имеют эквивалентный приоритет и оцениваются слева направо. Например,
[\pL--\p{Greek}&&\p{Uppercase}]
==[[\pL--\p{Greek}]&&\p{Uppercase}]
. - Отрицание:
[^a-z&&b]
==[^[a-z&&b]]
.
Композиты
Расписание | Description |
---|---|
xy |
Объединение (x за которым следует y ) |
x\|y |
Alternation (x или y , предпочитать x ) |
Повторений
Расписание | Description |
---|---|
x* |
Ноль или больше x (жадный) |
x+ |
Один или несколько x (жадный) |
x? |
Ноль или один из x (жадный) |
x*? |
Ноль или больше x (неуправляемый или ленивый) |
x+? |
Один или несколько x (неуправляемый или ленивый) |
x?? |
Ноль или один из x (неуправляемый или ленивый) |
x{n,m} |
По крайней мере n x и не более m x (жадный) |
x{n,} |
По крайней мере n x (жадный) |
x{n} |
Точно n x |
x{n,m}? |
По крайней мере n x и не более m x (ungreedy/lazy) |
x{n,}? |
По крайней мере n x (ungreedy/lazy) |
x{n}? |
Точно n x |
Пустые совпадения
Расписание | Description |
---|---|
^ |
Начало сена (или начало линии с многострочный режим) |
$ |
Конец сена (или конец линии с многострочный режим) |
\A |
Только начало сена (даже с поддержкой многострочный режим) |
\z |
Только конец сена (даже с поддержкой многострочный режим) |
\b |
Граница слова Юникода (\w с одной стороны и \W , \A или \z с другой стороны) |
\B |
Не граница слова Юникода |
\b{start} , \< |
Граница юникода начала слова (\W\|\A слева, \w справа) |
\b{end} , \> |
Граница конца слова Юникода (\w слева, \W\|\z справа) |
\b{start-half} |
Половина границы юникода начала слова (\W\|\A слева) |
\b{end-half} |
Половина границы конца слова Юникода (\W\|\z справа) |
Группирование и флаги
Расписание | Description |
---|---|
(exp) |
Нумерованная группа захвата (индексирована путем открытия круглых скобок) |
(?P<name>exp) |
Именованной (также нумерованной) группы захвата (имена должны быть альфа-числовыми) |
(?<name>exp) |
Именованной (также нумерованной) группы захвата (имена должны быть альфа-числовыми) |
(?:exp) |
Неимеционная группа |
(?flags) |
Установка флагов в текущей группе |
(?flags:exp) |
Задайте флаги для exp (без записи) |
Имена групп записи могут содержать только буквенно-числовые точки кода Юникода, точки .
, знаки подчеркивания _
и квадратные скобки[
и ]
. Имена должны начинаться с _
алфавитной или алфавитной точки кода. Алфавитные кодовые точки соответствуют свойству Юникода, а числовые кодовые точки соответствуют Alphabetic
объединению Decimal_Number
Letter_Number
Other_Number
и общим категориям.
Флаги — это одиночные символы. Например, (?x)
задает флаг x
и (?-x)
очищает флаг x
. Одновременно можно задать или очистить несколько флагов: (?xy)
задает и y
x
флаги, и (?x-y)
задает x
флаг и очищает y
флаг. По умолчанию все флаги отключены, если не указано в противном случае. В их число входят:
Флаг | Description |
---|---|
i |
Без учета регистра: буквы соответствуют как верхнему, так и нижнему регистру |
m |
Многострочный режим: ^ и $ начало и окончание строки совпадения |
s |
Разрешить точку (.). для сопоставления \n |
R |
Включает режим CRLF: если включен режим с несколькими строками, \r\n используется |
U |
Переключение смысла x* и x*? |
u |
Поддержка Юникода (включена по умолчанию) |
x |
Подробный режим, игнорирует пробелы и разрешает строковый комментарий (начиная с# ) |
Обратите внимание, что в подробном режиме пробелы игнорируются везде, в том числе в классах символов. Чтобы вставить пробелы, используйте ее экранированную форму или шестнадцатеричный литерал. Например, \
или \x20
для пространства ASCII.
Примечание.
- Флаги можно переключать в шаблоне. Например, в следующем синтаксисе используется нечувствительный регистр для первой части, а для второй части учитывается регистр.
(?i)a+(?-i)b+
a+
a
соответствует либо,A
но только совпаденияb+
b
.- Многострочный режим означает
^
и$
больше не совпадает только в начале или конце входных данных, но и в начале или конце строк. Обратите внимание, что^
совпадения после новых строк даже в конце входных данных. - Если включен режим CRLF и многострочный режим, то
^
и совпадают\r
\n
либо, но никогда не находятся в середине\r\n
$
. - Режим Юникода также может быть выборочно отключен, хотя только в том случае, если результат не будет соответствовать недопустимому UTF-8. Например, использование границы слова ASCII вместо границы слова Юникода может ускорить выполнение некоторых регулярных поисковых запросов:
(?-u:\b).+(?-u:\b)
для сопоставления$$abc$$
.
Escape-последовательности
Расписание | Description |
---|---|
\* |
Литерал * , применяется ко всем ASCII, кроме [0-9A-Za-z<>] |
\a |
Белл (\x07 ) |
\f |
Веб-канал формы (\x0C ) |
\t |
Горизонтальная табуляция |
\n |
Новая строка |
\r |
Возврат каретки |
\v |
Вертикальная вкладка (\x0B ) |
\A |
Матчи в начале сена |
\z |
Матчи в конце сена |
\b |
Утверждение границ Word |
\B |
Утверждение границы слова с отрицанием |
\b{start} , \< |
Утверждение границы начала слова |
\b{end} , \> |
Утверждение границ конца слова |
\b{start-half} |
Половина утверждения границы начала слова |
\b{end-half} |
Половина утверждения границы конца слова |
\123 |
Код восьмеричных символов до трех цифр |
\x7F |
Шестнадцатеричный код символов (ровно две цифры) |
\x{10FFFF} |
Шестнадцатеричный код символов, соответствующий точке кода Юникода |
\u007F |
Шестнадцатеричный код символов (ровно четыре цифры) |
\u{7F} |
Шестнадцатеричный код символов, соответствующий точке кода Юникода |
\U0000007F |
Шестнадцатеричный код символов (ровно восемь цифр) |
\U{7F} |
Шестнадцатеричный код символов, соответствующий точке кода Юникода |
\p{Letter} |
класс символов Unicode |
\P{Letter} |
Отрицание класса символов Юникода |
\d , , \s \w |
класс символов Perl |
\D , , \S \W |
Незначимый класс символов Perl |
Классы символов Perl (понятное для Юникода)
Эти классы основаны на определениях, предоставляемых в UTS#18:
Расписание | Description |
---|---|
\d |
Ddigit (\p{Nd} ) |
\D |
Не цифры |
\s |
Пробелы (\p{White_Space} ) |
\S |
Не пробелы |
\w |
Символ Word (\p{Alphabetic} \p{Join_Control} + + + \p{Pc} + \p{M} \d ) |
\W |
Не символ слова |
Классы символов ASCII
Эти классы основаны на определениях, предоставляемых в UTS#18:
Расписание | Description |
---|---|
[[:alnum:]] |
Буквенно-цифровые ([0-9A-Za-z] ) |
[[:alpha:]] |
Алфавит ([A-Za-z] ) |
[[:ascii:]] |
ASCII ([\x00-\x7F] ) |
[[:blank:]] |
Пустое ([\t ] ) |
[[:cntrl:]] |
Control ([\x00-\x1F\x7F] ) |
[[:digit:]] |
Цифры ([0-9] ) |
[[:graph:]] |
Графический ([!-~] ) |
[[:lower:]] |
Нижний регистр ([a-z] ) |
[[:print:]] |
Печать ([ -~] ) |
[[:punct:]] |
Знак препинания ([!-/:-@\[-`{-~] ) |
[[:space:]] |
Пробелы ([\t\n\v\f\r ] ) |
[[:upper:]] |
Верхний регистр ([A-Z] ) |
[[:word:]] |
Символы Word ([0-9A-Za-z_] ) |
[[:xdigit:]] |
Шестнадцатеричная цифра ([0-9A-Fa-f] ) |
Производительность
В этом разделе приведены некоторые рекомендации по скорости и использованию ресурсов регулярных выражений.
Юникод может повлиять на использование памяти и скорость поиска
KQL regex предоставляет поддержку первого класса для Юникода. Во многих случаях дополнительная память, необходимая для поддержки Юникода, не является незначительной и обычно не влияет на скорость поиска.
Ниже приведены некоторые примеры классов символов Юникода, которые могут повлиять на использование памяти и скорость поиска:
Использование памяти: влияние Юникода в основном возникает из использования классов символов Юникода. Классы символов Юникода, как правило, больше размера. Например,
\w
класс символов соответствует примерно 140 000 различных точек кода по умолчанию. Для этого требуется дополнительная память и может замедлить компиляцию регулярных выражений. Если ваши требования могут быть удовлетворены ASCII, рекомендуется использовать классы ASCII вместо классов Юникода. Единственная версия\w
ASCII может быть выражена несколькими способами, все из которых эквивалентны.[0-9A-Za-z_] (?-u:\w) [[:word:]] [\w&&\p{ascii}]
Скорость поиска: Юникод, как правило, обрабатывается довольно хорошо, даже при использовании больших классов символов Юникода. Однако некоторые из более быстрых внутренних обработчиков регрессии не могут обрабатывать утверждение границы слова в Юникоде. Поэтому, если вам не нужны утверждения границ с поддержкой Юникода, можно использовать
(?-u:\b)
вместо\b
него. Используется(?-u:\b)
определение только ASCII символа слова, которое может повысить скорость поиска.
Литералы могут ускорить поиск
KQL regex имеет сильную способность распознавать литералы в шаблоне регулярных выражений, что может значительно ускорить поиск. Если это возможно, включая литералы в шаблоне, можно значительно повысить производительность поиска. Например, в регулярных \w+@\w+
выражениях @
сначала сопоставляются вхождения, а затем выполняется обратное совпадение, чтобы \w+
найти начальную позицию.