Sdílet prostřednictvím


Syntaxe regulárních výrazů

Platí pro: ✅Microsoft FabricAzure Data Explorer✅Azure MonitorMicrosoft Sentinel

Tento článek obsahuje přehled syntaxe regulárních výrazů podporovaných dotazovací jazyk Kusto (KQL).

Existuje řada operátorů a funkcí KQL, které provádějí porovnávání řetězců, výběr a extrakci pomocí regulárních výrazů, jako matches regexje , parsea replace_regex().

V jazyce KQL musí být regulární výrazy kódovány jako řetězcové literály a dodržovat pravidla uvozování řetězců. Například regulární výraz \A je reprezentován v KQL jako "\\A". Zpětné lomítko navíc označuje, že druhé zpětné lomítko je součástí regulárního výrazu \A.

Syntaxe

Následující části dokumentují syntaxi regulárního výrazu podporovanou Kusto.

Shoda s jedním znakem

Vzor Popis
. Libovolný znak kromě nového řádku (zahrnuje nový řádek s příznakem s příznakem)
[0-9] Libovolná číslice ASCII
\d Číslice (\p{Nd})
\D Ne číslice
\pX Třída znaků Unicode identifikovaná názvem jedno písmena
\p{Greek} Třída znaků Unicode (obecná kategorie nebo skript)
\PX Negated Unicode character class identifikovaná jedním písmenem
\P{Greek} Negated Unicode character class (obecná kategorie nebo skript)

Třídy znaků

Vzor Popis
[xyz] Třída znaků odpovídající x, y nebo z (sjednocení).
[^xyz] Třída znaků odpovídající libovolnému znaku kromě x, y a z.
[a-z] Třída znaků odpovídající libovolnému znaku v rozsahu a-z.
[[:alpha:]] Třída znaků ASCII ([A-Za-z])
[[:^alpha:]] Negated ASCII character class ([^A-Za-z])
[x[^xyz]] Vnořená/seskupovací třída znaků (odpovídající libovolnému znaku s výjimkou y a z)
[a-y&&xyz] Průnik (odpovídající x nebo y)
[0-9&&[^4]] Odčítání pomocí průsečíku a negace (odpovídající 0-9 s výjimkou 4)
[0-9--4] Přímé odčítání (odpovídající 0–9 s výjimkou 4)
[a-g~~b-h] Symetrický rozdíl (porovnávání a a h pouze)
[\[\]] Řídicí znak ve třídách znaků (odpovídající [ nebo ])
[a&&b] Prázdná třída znaků, která neodpovídá nic

Poznámka:

Každá pojmenovaná třída znaků se může objevit uvnitř třídy závorek [...] znaků. Například [\p{Greek}[:digit:]] odpovídá libovolné číslici ASCII nebo libovolnému bodu kódu ve Greek skriptu. [\p{Greek}&&\pL] odpovídá řeckým písmenem.

Priorita ve třídách znaků je z většiny vazeb na nejmenší vazbu:

  1. Rozsahy: [a-cd] == [[a-c]d]
  2. Svaz: [ab&&bc] == [[ab]&&[bc]]
  3. Průnik, rozdíl, symetrický rozdíl: Všechny mají ekvivalentní prioritu a vyhodnocují se zleva doprava. Například [\pL--\p{Greek}&&\p{Uppercase}] == [[\pL--\p{Greek}]&&\p{Uppercase}].
  4. Negace: [^a-z&&b] == [^[a-z&&b]].

Kompozity

Vzor Popis
xy Zřetězení (x následované y)
x\|y Alternace (x nebo y , preferovat x)

Opakování

Vzor Popis
x* Nula nebo více x (greedy)
x+ Jeden nebo více x (greedy)
x? Nula nebo jedna z x (greedy)
x*? Nula nebo více x (negreedy/opožděné)
x+? Minimálně jeden z x (negreedy/opožděný)
x?? Nula nebo jedna z x (negreedy/opožděná)
x{n,m} Alespoň n x a nejvýše m x (greedy)
x{n,} Alespoň n x (greedy)
x{n} Přesně n x
x{n,m}? Alespoň n x a maximálně m x (bezgreedy/opožděné)
x{n,}? Alespoň n x (negreedy/opožděný)
x{n}? Přesně n x

Prázdné shody

Vzor Popis
^ Začátek sena (nebo začátek řádku s víceřádkovým režimem)
$ Konec sena (nebo konec řádku s víceřádkovým režimem)
\A Pouze začátek sena (i s povoleným víceřádkovým režimem)
\z Pouze konec sena (i s povoleným víceřádkovým režimem)
\b Hranice slova Unicode (\w na jedné straně a \W, \A, nebo \z na druhé)
\B Nejedná se o hranici slova Unicode.
\b{start}, \< Hranice slova unicode (\W\|\A vlevo, \w vpravo)
\b{end}, \> Hranice konce slova Unicode (\w vlevo, \W\|\z vpravo)
\b{start-half} Polovina hranice slova unicode (\W\|\A na levé straně)
\b{end-half} Polovina hranice konce slova Unicode (\W\|\z vpravo)

Seskupování a příznaky

Vzor Popis
(exp) Číslovaná skupina zachycení (indexovaná levou závorku)
(?P<name>exp) Pojmenovaná (také číslovaný) skupina zachycení (názvy musí být alfanumerické)
(?<name>exp) Pojmenovaná (také číslovaný) skupina zachycení (názvy musí být alfanumerické)
(?:exp) Skupina bez zachytávání
(?flags) Nastavení příznaků v rámci aktuální skupiny
(?flags:exp) Nastavení příznaků pro exp (nezachytávání)

Názvy skupin zachycení mohou obsahovat pouze alfanumerické body kódu Unicode, tečky ., podtržítka _a hranaté závorky[ a ]. Názvy musí začínat znakem _ abecedy. Abecední kódové body odpovídají Alphabetic vlastnosti Unicode, zatímco číselné body kódu odpovídají sjednocení Decimal_Numbera Letter_Number Other_Number obecné kategorie.

Příznaky jsou jednoduché znaky. Například (?x) nastaví příznak x a (?-x) vymaže příznak x. Najednou můžete nastavit nebo vymazat více příznaků: (?xy) nastaví příznak i x y příznak a (?x-y) příznak vymaže x y . Ve výchozím nastavení jsou všechny příznaky zakázány, pokud není uvedeno jinak. Mezi ně patří:

Příznak Popis
i Nerozlišují malá a velká písmena: Písmena odpovídají velkým i menšímu písmenu.
m Víceřádkový režim: ^ a $ porovná začátek/konec řádku
s Povolit tečku (.). spárovat \n
R Povolí režim CRLF: pokud je povolený víceřádkový režim, \r\n použije se
U Prohození významu x* a x*?
u Podpora unicode (ve výchozím nastavení povolená)
x Podrobný režim, ignoruje prázdné znaky a povolí řádkové komentáře (počínaje #)

Všimněte si, že v podrobném režimu se prázdné znaky ignorují všude, včetně tříd znaků. Pokud chcete vložit prázdné znaky, použijte jeho řídicí tvar nebo šestnáctkový literál. Například \ pro \x20 mezeru v ASCII.

Poznámka:

  • Příznaky lze přepínat v rámci vzoru. Například následující syntaxe používá shodu nerozlišující malá a velká písmena pro první část a shodu s rozlišováním velkých a malých písmen pro druhou část: (?i)a+(?-i)b+.
  • a+ odpovídá buď a nebo A, ale b+ jediné shody b.
  • Režim víceřádkového režimu znamená ^ , že $ se už neshoduje jen na začátku nebo na konci vstupu, ale také na začátku nebo na konci řádků. Všimněte si, že ^ odpovídá za novými řádky, a to i na konci vstupu.
  • Pokud je povolen režim CRLF i víceřádkový režim, pak a porovná \r buď a $ \n, ale nikdy uprostřed \r\n.^
  • Režim Unicode lze také selektivně zakázat, i když se výsledek neshoduje s neplatným kódováním UTF-8. Například použití hranice slova ASCII místo hranice slova Unicode může zrychlit hledání regulárních výrazů: (?-u:\b).+(?-u:\b) aby odpovídaly $$abc$$.

Řídicí sekvence

Vzor Popis
\* Literál *, platí pro všechny ASCII s výjimkou [0-9A-Za-z<>]
\a Zvonek (\x07)
\f Informační kanál formuláře (\x0C)
\t Horizontální tabulátor
\n Nový řádek
\r Návrat na začátek řádku
\v Svislá karta (\x0B)
\A Odpovídá na začátku sena
\z Zápasy na konci sena
\b Kontrolní výraz hranice slova
\B Kontrolní výraz hranice negated slova
\b{start}, \< Počáteční výraz hranice slova
\b{end}, \> Kontrolní výraz hranice konce slova
\b{start-half} Polovina kontrolního výrazu hranice začátku slova
\b{end-half} Polovina kontrolního výrazu hranice konce slova
\123 Osmičkový kód znaku, až tři číslice
\x7F Šestnáctkový znakový kód (přesně dvě číslice)
\x{10FFFF} Šestnáctkový kód znaku odpovídající bodu kódu Unicode
\u007F Šestnáctkový znakový kód (přesně čtyři číslice)
\u{7F} Šestnáctkový kód znaku odpovídající bodu kódu Unicode
\U0000007F Šestnáctkový znakový kód (přesně osm číslic)
\U{7F} Šestnáctkový kód znaku odpovídající bodu kódu Unicode
\p{Letter} Znaková třída Unicode
\P{Letter} Negated Unicode character class
\d, , \s\w Perl character – třída
\D, , \S\W Negated Perl character – třída

Třídy znaků Perl (popisné pro Unicode)

Tyto třídy jsou založené na definicích poskytovaných v UTS#18:

Vzor Popis
\d Ddigit (\p{Nd})
\D Neciferné číslo
\s Prázdné znaky (\p{White_Space})
\S Prázdné znaky
\w Znak wordu (\p{Alphabetic}\d + \p{Pc}\p{M}\p{Join_Control} + + + )
\W Neslovný znak

Třídy znaků ASCII

Tyto třídy jsou založené na definicích poskytovaných v UTS#18:

Vzor Popis
[[:alnum:]] Alfanumerické ([0-9A-Za-z])
[[:alpha:]] Abecední ([A-Za-z])
[[:ascii:]] ASCII ([\x00-\x7F])
[[:blank:]] Prázdné ([\t ])
[[:cntrl:]] Ovládací prvek ([\x00-\x1F\x7F])
[[:digit:]] Číslice ([0-9])
[[:graph:]] Grafické ([!-~])
[[:lower:]] Malé písmeno ([a-z])
[[:print:]] Tisknutelné ([ -~])
[[:punct:]] Interpunkce ([!-/:-@\[-`{-~])
[[:space:]] Prázdné znaky ([\t\n\v\f\r ])
[[:upper:]] Velká písmena ([A-Z])
[[:word:]] Znaky wordu ([0-9A-Za-z_])
[[:xdigit:]] Šestnáctkové číslice ([0-9A-Fa-f])

Výkon

Tato část obsahuje některé pokyny k rychlosti a využití prostředků výrazů regulárních výrazů.

Unicode může mít vliv na využití paměti a rychlost vyhledávání.

Regex KQL poskytuje prvotřídní podporu pro Unicode. V mnoha případech je dodatečná paměť potřebná k podpoře Unicode zanedbatelná a obvykle nemá vliv na rychlost vyhledávání.

Následuje několik příkladů tříd znaků Unicode, které můžou mít vliv na využití paměti a rychlost vyhledávání:

  • Využití paměti: Vliv unicode primárně vzniká z použití tříd znaků Unicode. Třídy znaků Unicode mají tendenci být větší. Třída znaků například \w ve výchozím nastavení odpovídá přibližně 140 000 odlišným bodům kódu. To vyžaduje další paměť a může zpomalit kompilaci regulárních výrazů. Pokud vaše požadavky může ASCII splnit, doporučuje se místo tříd Unicode používat třídy ASCII. Verze \w pouze ASCII může být vyjádřena několika způsoby, z nichž všechny jsou ekvivalentní.

    [0-9A-Za-z_]
    (?-u:\w)
    [[:word:]]
    [\w&&\p{ascii}]
    
  • Rychlost vyhledávání: Unicode se obvykle zpracovává docela dobře, i když používáte velké třídy znaků Unicode. Některé z rychlejších interních modulů regulárních výrazů však nedokážou zpracovat kontrolní výraz hranice slova v kódu Unicode. Pokud tedy nepotřebujete kontrolní výrazy hranice slov podporující unicode, můžete místo toho zvážit použití (?-u:\b) \b. Používá (?-u:\b) definici znaku slova pouze ASCII, která může zlepšit rychlost vyhledávání.

Literály můžou zrychlit hledání.

Regulární výraz KQL má silnou schopnost rozpoznávat literály v rámci vzoru regulárních výrazů, což může výrazně urychlit vyhledávání. Pokud je to možné, včetně literálů ve vašem vzoru, může výrazně zlepšit výkon hledání. Například v regulárním výrazu \w+@\w+se první výskyty @ shodují a pak se provede zpětná shoda, aby \w+ bylo možné najít počáteční pozici.