Udostępnij za pośrednictwem


Składnia wyrażenia regularnego

Dotyczy: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft Sentinel

Ten artykuł zawiera omówienie składni wyrażeń regularnych obsługiwanych przez język zapytań Kusto (KQL).

Istnieje wiele operatorów I funkcji języka KQL, które wykonują dopasowywanie ciągów, wybór i wyodrębnianie za pomocą wyrażeń regularnych, takich jak matches regex, parsei replace_regex().

W języku KQL wyrażenia regularne muszą być zakodowane jako literały ciągu i postępować zgodnie z regułami cudzysłowów ciągów. Na przykład wyrażenie \A regularne jest reprezentowane w języku KQL jako "\\A". Dodatkowy ukośnik odwrotny wskazuje, że drugi ukośnik odwrotny jest częścią wyrażenia \Aregularnego .

Składnia

W poniższych sekcjach dokumentacji składni wyrażeń regularnych obsługiwanych przez usługę Kusto.

Dopasuj jeden znak

Wzorzec opis
. Dowolny znak z wyjątkiem nowego wiersza (zawiera nowy wiersz z flagą s)
[0-9] Dowolna cyfra ASCII
\d Cyfra (\p{Nd})
\D Nie cyfra
\pX Klasa znaków Unicode identyfikowana przez jednoliterową nazwę
\p{Greek} Klasa znaków Unicode (ogólna kategoria lub skrypt)
\PX Negowana klasa znaków Unicode zidentyfikowana przez jednoliterową nazwę
\P{Greek} Negowana klasa znaków Unicode (ogólna kategoria lub skrypt)

Klasy znaków

Wzorzec opis
[xyz] Dopasowanie klasy znaków x, y lub z (union).
[^xyz] Klasa znaków pasująca do dowolnego znaku z wyjątkiem znaków x, y i z.
[a-z] Klasa znaków pasująca do dowolnego znaku w zakresie a-z.
[[:alpha:]] Klasa znaków ASCII ([A-Za-z])
[[:^alpha:]] Negowana klasa znaków ASCII ([^A-Za-z])
[x[^xyz]] Zagnieżdżone/grupowane klasy znaków (pasujące do dowolnego znaku z wyjątkiem y i z)
[a-y&&xyz] Skrzyżowanie (pasujące x lub y)
[0-9&&[^4]] Odejmowanie przy użyciu przecięcia i negacji (dopasowanie 0–9 z wyjątkiem 4)
[0-9--4] Odejmowanie bezpośrednie (dopasowanie 0–9 z wyjątkiem 4)
[a-g~~b-h] Różnica symetryczna (dopasowywanie a i h tylko)
[\[\]] Ucieczka w klasach znaków (dopasowanie [lub ])
[a&&b] Pusta klasa znaków nie pasuje do niczego

Uwaga

Każda nazwana klasa znaków może pojawić się wewnątrz klasy znaków w nawiasie [...] . Na przykład pasuje [\p{Greek}[:digit:]] do dowolnej cyfry ASCII lub dowolnego punktu kodu w Greek skrycie. [\p{Greek}&&\pL] pasuje do greckich liter.

Pierwszeństwo w klasach znaków jest od większości powiązań do najmniejszego powiązania:

  1. Zakresy: [a-cd] == [[a-c]d]
  2. Unia: [ab&&bc] == [[ab]&&[bc]]
  3. Skrzyżowanie, różnica, różnica symetryczna: Wszystkie mają równoważne pierwszeństwo i są oceniane od lewej do prawej. Na przykład [\pL--\p{Greek}&&\p{Uppercase}] == [[\pL--\p{Greek}]&&\p{Uppercase}].
  4. Negacja: [^a-z&&b] == [^[a-z&&b]].

Kompozyty

Wzorzec opis
xy Łączenie (x a następnie y)
x\|y Alternation (x lub y , preferuj x)

Powtórzeń

Wzorzec opis
x* Zero lub więcej x (chciwość)
x+ Co najmniej jeden x (chciwość)
x? Zero lub jeden z x (chciwość)
x*? Zero lub więcej x (niegreedy/leniwy)
x+? Co najmniej jeden x (niegreedy/leniwy)
x?? Zero lub jeden z x (niegreedy/leniwy)
x{n,m} Co najmniej n x i co najwyżej m x (chciwość)
x{n,} Co najmniej n x (chciwość)
x{n} Dokładnie n x
x{n,m}? Co najmniej n x i co najwyżej m x (niegreedy/leniwy)
x{n,}? Co najmniej n x (niegreedy/leniwy)
x{n}? Dokładnie n x

Puste dopasowania

Wzorzec opis
^ Początek siana (lub początek linii z trybem wielowierszowym)
$ Koniec stosu siana (lub koniec linii z trybem wielowierszowym)
\A Tylko początek siana (nawet z włączonym trybem wielowierszowym)
\z Tylko koniec siana (nawet z włączonym trybem wielowierszowym)
\b Granica wyrazów Unicode (\w po jednej stronie i \W, \Alub \z na drugiej)
\B Nie granica wyrazu Unicode
\b{start}, \< Granica początkowa słowa Unicode (\W\|\A po lewej stronie \w po prawej stronie)
\b{end}, \> Granica końca wyrazu Unicode (\w po lewej stronie \W\|\z po prawej stronie)
\b{start-half} Połowa granicy początku słowa Unicode (\W\|\A po lewej stronie)
\b{end-half} Połowa granicy końca słowa Unicode (\W\|\z po prawej stronie)

Grupowanie i flagi

Wzorzec opis
(exp) Ponumerowana grupa przechwytywania (indeksowana przez otwarcie nawiasu)
(?P<name>exp) Nazwana (również numerowana) grupa przechwytywania (nazwy muszą być alfanumeryczne)
(?<name>exp) Nazwana (również numerowana) grupa przechwytywania (nazwy muszą być alfanumeryczne)
(?:exp) Grupa nieuchwytna
(?flags) Ustawianie flag w bieżącej grupie
(?flags:exp) Ustawianie flag dla exp (brak przechwytywania)

Nazwy grup przechwytywania mogą zawierać tylko alfanumeryczne punkty kodu Unicode, kropki., podkreślenia i nawiasy kwadratowe _[ i ]. Nazwy muszą zaczynać się od _ punktu kodu alfabetycznego lub alfabetycznego. Alfabetyczne punkty kodu odpowiadają Alphabetic właściwości Unicode, a punkty kodowe liczbowe odpowiadają unii Decimal_Numberkategorii , Letter_Number i Other_Number ogólnych.

Flagi są pojedynczymi znakami. Na przykład (?x) ustawia flagę x i (?-x) czyści flagę x. Jednocześnie można ustawić lub wyczyścić wiele flag: (?xy) ustawia flagi x i y oraz (?x-y) ustawia flagę x i czyści flagę y . Domyślnie wszystkie flagi są wyłączone, chyba że określono inaczej. Są to:

Flaga opis
i Bez uwzględniania wielkości liter: litery pasują do obu wielkich i małych liter
m Tryb wielowierszowy: ^ i $ dopasuj początek/koniec wiersza
s Zezwalaj na kropkę (.). aby dopasować \n
R Włącza tryb CRLF: gdy jest włączony tryb wielowierszowy, \r\n jest używany
U Zamiana znaczenia i x*x*?
u Obsługa unicode (domyślnie włączona)
x Tryb pełny, ignoruje białe znaki i zezwala na komentarze wiersza (począwszy od #)

Należy pamiętać, że w trybie pełnym odstępy są ignorowane wszędzie, w tym w klasach znaków. Aby wstawić biały znak, użyj formularza ucieczki lub literału szesnastkowego. Na przykład \ lub \x20 dla spacji ASCII.

Uwaga

  • Flagi można przełączać w ramach wzorca. Na przykład następująca składnia używa dopasowania bez uwzględniania wielkości liter w pierwszej części i dopasowania uwzględniającego wielkość liter w drugiej części: (?i)a+(?-i)b+.
  • a+dopasuje wartość a lub A, ale jedyną wartością b+ jest .b
  • Tryb wielowierszowy oznacza ^ i $ nie jest już zgodny tylko na początku lub na końcu danych wejściowych, ale także na początku lub na końcu wierszy. Należy pamiętać, że ^ pasuje do nowych wierszy, nawet na końcu danych wejściowych.
  • Gdy tryb CRLF i tryb wielowierszowy są włączone, wówczas i pasują \r do obu i \n, ale nigdy w środku elementu \r\n.$ ^
  • Tryb Unicode można również selektywnie wyłączyć, chociaż tylko wtedy, gdy wynik nie będzie zgodny z nieprawidłowym identyfikatorem UTF-8. Na przykład użycie granicy wyrazu ASCII zamiast granicy wyrazu Unicode może sprawić, że niektóre wyszukiwania wyrażeń regularnych będą działać szybciej: (?-u:\b).+(?-u:\b) aby dopasować $$abc$$element .

Sekwencje ucieczki

Wzorzec opis
\* Literał *, dotyczy wszystkich elementów ASCII z wyjątkiem [0-9A-Za-z<>]
\a Dzwonek (\x07)
\f Źródło danych formularzy (\x0C)
\t Karta Pozioma
\n Nowy wiersz
\r Powrót karetki
\v Karta pionowa (\x0B)
\A Mecze na początku stosu siana
\z Mecze na końcu siana
\b Asercji granic wyrazów
\B Negowana aseracja granicy słowa
\b{start}, \< Aseracja granicy początku słowa
\b{end}, \> Asercji końca granicy słowa
\b{start-half} Połowa potwierdzenia granicy początku słowa
\b{end-half} Połowa potwierdzenia granicy końca słowa
\123 Kod znaku ósemkowego, maksymalnie trzy cyfry
\x7F Kod znaku szesnastkowego (dokładnie dwie cyfry)
\x{10FFFF} Kod szesnastkowy odpowiadający punktowi kodu Unicode
\u007F Kod znaku szesnastkowego (dokładnie cztery cyfry)
\u{7F} Kod szesnastkowy odpowiadający punktowi kodu Unicode
\U0000007F Kod znaku szesnastkowego (dokładnie osiem cyfr)
\U{7F} Kod szesnastkowy odpowiadający punktowi kodu Unicode
\p{Letter} Unicode, klasa znaków
\P{Letter} Negowana klasa znaków Unicode
\d, , \s\w Perl, klasa znaków
\D, , \S\W Negowana klasa znaków Perl

Klasy znaków perl (przyjazny dla Unicode)

Te klasy są oparte na definicjach podanych w języku UTS#18:

Wzorzec opis
\d Ddigit (\p{Nd})
\D Nie cyfra
\s Biały znak (\p{White_Space})
\S Nie odstępy
\w Znak wyrazu (\p{Alphabetic}\d + \p{Pc}\p{M}\p{Join_Control} + + + )
\W Znak nie wyrazu

Klasy znaków ASCII

Te klasy są oparte na definicjach podanych w języku UTS#18:

Wzorzec opis
[[:alnum:]] Alfanumeryczne ([0-9A-Za-z])
[[:alpha:]] Alfabetyczne ([A-Za-z])
[[:ascii:]] ASCII ([\x00-\x7F])
[[:blank:]] Puste ([\t ])
[[:cntrl:]] Kontrolka ([\x00-\x1F\x7F])
[[:digit:]] Cyfry ([0-9])
[[:graph:]] Graficzne ([!-~])
[[:lower:]] Małe litery ([a-z])
[[:print:]] Drukowanie ([ -~])
[[:punct:]] Interpunkcja ([!-/:-@\[-`{-~])
[[:space:]] Biały znak ([\t\n\v\f\r ])
[[:upper:]] Wielkie litery ([A-Z])
[[:word:]] Znaki programu Word ([0-9A-Za-z_])
[[:xdigit:]] Cyfra szesnastkowy ([0-9A-Fa-f])

Wydajność

Ta sekcja zawiera wskazówki dotyczące szybkości i użycia zasobów wyrażeń wyrażeń wyrażeń regularnych.

Unicode może mieć wpływ na użycie pamięci i szybkość wyszukiwania

Wyrażenie regularne KQL zapewnia pierwszą klasę obsługi unicode. W wielu przypadkach dodatkowa pamięć wymagana do obsługi formatu Unicode jest niewielka i zwykle nie wpływa na szybkość wyszukiwania.

Poniżej przedstawiono kilka przykładów klas znaków Unicode, które mogą mieć wpływ na użycie pamięci i szybkość wyszukiwania:

  • Użycie pamięci: wpływ unicode wynika głównie z używania klas znaków Unicode. Klasy znaków Unicode mają zwykle większy rozmiar. Na przykład \w klasa znaków domyślnie pasuje do około 140 000 odrębnych punktów kodu. Wymaga to dodatkowej pamięci i może spowolnić kompilację wyrażeń regularnych. Jeśli wymagania mogą być spełnione przez ASCII, zaleca się używanie klas ASCII zamiast klas Unicode. Wersja tylko ASCII może być wyrażona \w na wiele sposobów, z których wszystkie są równoważne.

    [0-9A-Za-z_]
    (?-u:\w)
    [[:word:]]
    [\w&&\p{ascii}]
    
  • Szybkość wyszukiwania: Unicode jest obsługiwane całkiem dobrze, nawet w przypadku korzystania z dużych klas znaków Unicode. Jednak niektóre z szybszych aparatów wewnętrznych wyrażeń regularnych nie mogą obsłużyć asercji granicy słowa obsługującego Unicode. Jeśli więc nie potrzebujesz asercji granic wyrazów obsługujących unicode, możesz rozważyć użycie (?-u:\b) zamiast \b. Funkcja (?-u:\b) używa definicji wyrazu tylko ASCII, która może poprawić szybkość wyszukiwania.

Literały mogą przyspieszyć wyszukiwanie

Wyrażenie regularne KQL ma silną zdolność rozpoznawania literałów we wzorcu wyrażeń regularnych, co może znacznie przyspieszyć wyszukiwanie. Jeśli to możliwe, uwzględnienie literałów we wzorcu może znacznie poprawić wydajność wyszukiwania. Na przykład w regex \w+@\w+pierwsze wystąpienia @ są dopasowane, a następnie jest wykonywane \w+ odwrotne dopasowanie w celu znalezienia pozycji początkowej.