Wyrażenia regularne (C++)

Standardowa biblioteka języka C++ obsługuje wiele gramatyki wyrażeń regularnych. W tym temacie omówiono odmiany gramatyczne dostępne podczas korzystania z wyrażeń regularnych.

Gramatyka wyrażeń regularnych

Gramatyka wyrażenia regularnego do użycia jest określona przez użycie jednej z std::regex_constants::syntax_option_type wartości wyliczenia. Te gramatyki wyrażeń regularnych są definiowane w pliku std::regex_constants:

  • ECMAScript: Jest to najbliżej gramatyki używanej przez język JavaScript i .NET.
  • basic: Wyrażenia regularne POSIX basic lub BRE.
  • extended: Wyrażenia regularne POSIX extended lub ERE.
  • awk: jest extendedto , ale ma więcej ucieczki dla znaków niedrukowych.
  • grep: jest basicto , ale umożliwia również znakom nowego wiersza (\n) oddzielenie zmian.
  • egrep: jest extendedto , ale umożliwia również znakom nowego wiersza oddzielenie zmian.

Domyślnie, jeśli nie określono gramatyki, ECMAScript przyjmuje się założenie. Można określić tylko jedną gramatykę.

Można również zastosować kilka flag:

  • icase: Ignoruj wielkość liter podczas dopasowywania.
  • nosubs: Ignoruj oznaczone dopasowania (czyli wyrażenia w nawiasach); nie są przechowywane żadne podstawianie.
  • optimize: Szybsze dopasowywanie, kosztem większego czasu budowy.
  • collate: Użyj sekwencji sortowania z uwzględnieniem ustawień regionalnych (na przykład zakresów formularza [a-z]).

Zero lub więcej flag można połączyć z gramatyką, aby określić zachowanie aparatu wyrażeń regularnych. Jeśli określono tylko flagi, przyjmuje się jako ECMAScript gramatykę.

Element

Element może być jednym z następujących elementów:

  • Zwykły znak , który pasuje do tego samego znaku w sekwencji docelowej.

  • Symbol '.' wieloznaczny, który pasuje do dowolnego znaku w sekwencji docelowej z wyjątkiem nowego wiersza.

  • Wyrażenie w nawiasie kwadratowym formularza [expr], które pasuje do znaku lub elementu sortowania w sekwencji docelowej, która znajduje się również w zestawie zdefiniowanym przez wyrażenie exprlub formularza [^expr], który pasuje do znaku lub elementu sortowania w sekwencji docelowej, która nie znajduje się w zestawie zdefiniowanym przez wyrażenie expr.

    Wyrażenie expr może zawierać dowolną kombinację następujących elementów:

    • Pojedynczy znak. Dodaje znak do zestawu zdefiniowanego przez expr.

    • Zakres znaków formularza ch1-ch2. Dodaje znaki reprezentowane przez wartości w zamkniętym zakresie [ch1, ch2] do zestawu zdefiniowanego przez expr.

    • Klasa znaków formularza [:name:]. Dodaje znaki w nazwanej klasie do zestawu zdefiniowanego przez expr.

    • Klasa równoważności formularza [=elt=]. Dodaje elementy sortowania, które są równoważne elt zestawowi zdefiniowanemu przez exprelement .

    • Symbol sortowania formularza [.elt.]. Dodaje element elt sortowania do zestawu zdefiniowanego przez exprelement .

  • Kotwica. Kotwica ^ pasuje do początku sekwencji docelowej. Kotwica $ jest zgodna z końcem sekwencji docelowej.

Grupa przechwytywania formularza (podwyrażenie) lub \(subexpression\) w basic i grep, która pasuje do sekwencji znaków w sekwencji docelowej, która jest zgodna ze wzorcem między ogranicznikami.

  • Tożsamość ucieczki formularza \k, który pasuje do znaku k w sekwencji docelowej.

Przykłady:

  • a pasuje do sekwencji "a" docelowej, ale nie pasuje do sekwencji "B"docelowych , "b"lub "c".

  • .pasuje do wszystkich sekwencji "a"docelowych , , "B""b"i "c".

  • [b-z] pasuje do sekwencji "b" docelowych, "c" ale nie pasuje do sekwencji "a" docelowych ani "B".

  • [:lower:] pasuje do sekwencji "a"docelowych , "b"i "c" , ale nie jest zgodna z sekwencją "B"docelową .

  • (a) Pasuje do sekwencji "a" docelowej i kojarzy grupę przechwytywania 1 z podsekwencją "a", ale nie pasuje do sekwencji "B"docelowych , "b"lub "c".

W ECMAScriptelementach , basici grepelement może być również odwołaniem wstecznym formularza \dd, gdzie dd reprezentuje wartość dziesiętną N zgodną z sekwencją znaków w sekwencji docelowej, która jest taka sama jak sekwencja znaków pasujących do grupy przechwytywania N.

Na przykład pasuje do sekwencji docelowej, (a)\1 ponieważ pierwsza (i tylko) grupa przechwytywania jest zgodna z początkową sekwencją "aa""a" , a następnie \1 pasuje do sekwencji "a"końcowej .

W ECMAScriptsystemie element może być również jednym z następujących elementów:

  • Grupa nieuchwytna formularza (?: podwyrażenie). Pasuje do sekwencji znaków w sekwencji docelowej, do której pasuje wzorzec między ogranicznikami.

  • Ograniczony format pliku ucieczki formularza \f, , \n\r, \tlub \v. Pasują one, odpowiednio, do wciągnięcia kartki, nowego wiersza, powrotu karetki, tabulatora poziomego i tabulatora pionowego w sekwencji docelowej.

  • Pozytywna asercja formularza (= podwyrażenie). Pasuje do sekwencji znaków w sekwencji docelowej, która jest zgodna ze wzorcem między ogranicznikami, ale nie zmienia pozycji dopasowania w sekwencji docelowej.

  • Negatywna asercja formularza (! podekskrypcja). Dopasuje dowolną sekwencję znaków w sekwencji docelowej, która nie pasuje do wzorca między ogranicznikami i nie zmienia pozycji dopasowania w sekwencji docelowej.

  • Sekwencja ucieczki szesnastkowej formularza \xhh. Dopasuje znak w sekwencji docelowej reprezentowanej przez dwie cyfry szesnastkowe hh.

  • Sekwencja ucieczki unicode formularza \uhhhh. Dopasuje znak w sekwencji docelowej reprezentowanej przez cztery cyfry szesnastkowe hhhh.

  • Sekwencja ucieczki kontrolki formularza \ck. Pasuje do znaku sterującego, który jest nazwany przez znak k.

  • Potwierdzenie granicy wyrazu formularza\b. Dopasuje, gdy bieżące położenie w sekwencji docelowej jest natychmiast po granicy słowa.

  • Negatywna asercja granicy wyrazu formularza \B. Pasuje, gdy bieżące położenie w sekwencji docelowej nie jest natychmiast po granicy słowa.

  • Znak dsw ucieczki formularza \d, , \D, \s\S, \w, \W. Zawiera skróconą nazwę klasy znaków.

Przykłady:

  • (?:a) pasuje do sekwencji "a"docelowej , ale "(?:a)\1" jest nieprawidłowa, ponieważ nie ma grupy przechwytywania 1.

  • (=a)a pasuje do sekwencji "a"docelowej . Asercja dodatnia jest zgodna z początkową sekwencją w sekwencji "a" docelowej, a końcowa "a" w wyrażeniu regularnym jest zgodna z początkową sekwencją w sekwencji "a" docelowej.

  • (!a)a nie jest zgodna z sekwencją "a"docelową .

  • a\b. pasuje do sekwencji "a~"docelowej , ale nie jest zgodna z sekwencją "ab"docelową .

  • a\B. pasuje do sekwencji "ab"docelowej , ale nie jest zgodna z sekwencją "a~"docelową .

W awksystemie element może być również jednym z następujących elementów:

  • Ucieczka formatu pliku formularza \\, , \a, \f\b, \n, \r, \tlub \v. Pasują one, odpowiednio, do odwrotnego ukośnika, alertu, backspace, wciągnięcia kartki, nowego wiersza, powrotu karetki, tabulatora poziomego i tabulatora pionowego w sekwencji docelowej.

  • ósemkowa sekwencja ucieczki formularza \ooo. Dopasuje znak w sekwencji docelowej, której reprezentacja jest wartością reprezentowaną przez jedną, dwie lub trzy cyfry ósemkowe ooo.

Powtórzenie

Każdy element inny niż asercja dodatnia, asercja negatywna lub kotwica może być obserwowany przez liczbę powtórzeń. Najbardziej ogólny rodzaj liczby powtórzeń przyjmuje postać {min,max}lub \{min,max\} w i basicgrep. Element, po którym następuje ta forma liczby powtórzeń, pasuje do co najmniej min kolejnych wystąpień i nie więcej niż maksymalna liczba kolejnych wystąpień sekwencji zgodnej z elementem.

Na przykład a{2,3} dopasuje sekwencję docelową i sekwencję "aa" docelową, ale nie sekwencję "aaa""a" docelową lub sekwencję "aaaa"docelową .

Licznik powtórzeń może mieć również jedną z następujących postaci:

  • {min} lub \{min} w systemach basic i grep. Odpowiednik {min,min}.

  • {min,} lub \{min,\} w basic systemach i grep. Odpowiednik {min,unbounded}.

  • *jest równoważne {0,unbounded}.

Przykłady:

  • a{2} dopasuje sekwencję "aa" docelową, ale nie sekwencję "a" docelową lub sekwencję "aaa"docelową .

  • a{2,}pasuje do sekwencji docelowej , sekwencji "aa"docelowej itd., ale nie jest zgodna z sekwencją "aaa""a"docelową .

  • a*dopasuje sekwencję ""docelową , sekwencję docelową , sekwencję "a""aa"docelową itd.

W przypadku wszystkich gramatyki z wyjątkiem basic i grepliczba powtórzeń może również mieć jedną z następujących form:

  • ? jest równoważne z {0,1}.

  • +jest równoważne {1,unbounded}.

Przykłady:

  • a? pasuje do sekwencji docelowej i sekwencji """a"docelowej , ale nie do sekwencji "aa"docelowej .

  • a+dopasuje sekwencję docelową , sekwencję "a""aa"docelową itd., ale nie sekwencję ""docelową .

W ECMAScriptsystemie wszystkie formy liczby powtórzeń mogą być następnie znak ? , który wyznacza niechłanne powtórzenie.

Łączenie

Elementy wyrażeń regularnych, z liczbami powtórzeń lub bez ich, mogą być łączone w celu utworzenia dłuższych wyrażeń regularnych. Wyrażenie wynikowe pasuje do sekwencji docelowej będącej połączeniem sekwencji, do których pasują poszczególne elementy.

Na przykład a{2,3}b pasuje do sekwencji "aab" docelowej i sekwencji docelowej , ale nie jest zgodna z sekwencją "ab""aaab"docelową ani sekwencją "aaaab"docelową .

Alternatywa

We wszystkich gramatykach wyrażeń regularnych z wyjątkiem basic i grep, po znaku (potoku) i innym połączonym wyrażeniu regularnym można utworzyć połączenie wyrażenia regularnego | . W ten sposób można łączyć dowolną liczbę połączonych wyrażeń regularnych. Wyrażenie wynikowe pasuje do dowolnej sekwencji docelowej, do której pasuje jedno lub więcej z połączonych wyrażeń regularnych.

Gdy więcej niż jedno ze połączonych wyrażeń regularnych jest zgodne z sekwencją docelową, ECMAScript wybiera pierwsze ze połączonych wyrażeń regularnych, które pasują do sekwencji jako dopasowanie, które będzie określane jako pierwsze dopasowanie. Pozostałe gramatyki wyrażeń regularnych wybierają gramatykę, która osiąga najdłuższe dopasowanie.

Na przykład ab|cd pasuje do sekwencji "ab" docelowej i sekwencji docelowej , ale nie jest zgodna z sekwencją "abd""cd"docelową ani sekwencją "acd"docelową .

W grep systemach i egrepmożna używać nowego znaku linii (\n) do oddzielania zmian.

Wyrażenie cząstkowe

W basic systemach i greppodwyrażenie jest łączeniem. W innych gramatykach wyrażeń regularnych wyrażenie cząstkowe jest alternatywą.

Podsumowanie gramatyki

W następującej tabeli podsumowano funkcje, które są dostępne w różnych gramatykach wyrażeń regularnych:

Element basic extended ECMAScript grep egrep awk
naprzemienność przy użyciu | + + + +
naprzemienność przy użyciu \n + +
kotwica + + + + + +
dopasowanie wsteczne + + +
wyrażenie w nawiasie kwadratowym + + + + + +
przechwytywanie grupy przy użyciu () + + + +
przechwytywanie grupy przy użyciu \(\) + +
kontrolna sekwencja unikowa +
sekwencja unikowa dsw +
sekwencja unikowa formatu pliku + +
szesnastkowa sekwencja unikowa +
ucieczka tożsamości + + + + + +
asercja negatywna +
asercja negatywna granicy słowa +
grupa nieprzechwytująca +
powtórzenie niezachłanne +
ósemkowa sekwencja unikowa +
zwykły znak + + + + + +
asercja pozytywna +
powtórzenie przy użyciu polecenia {} + + + +
powtórzenie przy użyciu polecenia \{\} + +
powtórzenie przy użyciu polecenia * + + + + + +
powtórzenie przy użyciu elementu ? i + + + + +
sekwencja unikowa unicode +
symbol wieloznaczny + + + + + +
asercja granicy słowa +

Szczegóły semantyczne

Kotwica

Kotwica pasuje do pozycji w ciągu docelowym, a nie do znaku. Element ^ pasuje do początku ciągu docelowego i $ pasuje do końca ciągu docelowego.

Odwołanie wsteczne

Odwołanie odwrotne to ukośnik odwrotny, po którym następuje wartość dziesiętna N. Pasuje do zawartości grupy przechwytywania Nth. Wartość N nie może być większa niż liczba grup przechwytywania, które poprzedzają dopasowanie wsteczne. W basic i grepwartość N jest określana przez cyfrę dziesiętną, która następuje po ukośniku odwrotnym. W ECMAScriptpliku wartość N jest określana przez wszystkie cyfry dziesiętne, które natychmiast następują po ukośniku odwrotnym. W związku z tym w basic i grepwartość N nigdy nie jest większa niż 9, nawet jeśli wyrażenie regularne ma więcej niż dziewięć grup przechwytywania. W ECMAScriptpliku wartość N jest niezwiązana.

Przykłady:

  • ((a+)(b+))(c+)\3 pasuje do sekwencji "aabbbcbbb"docelowej . Odwołanie \3 wsteczne pasuje do tekstu w trzeciej grupie przechwytywania, czyli "(b+)". Nie jest ona zgodna z sekwencją "aabbbcbb"docelową .

  • (a)\2 jest nieprawidłowy.

  • (b(((((((((a))))))))))\10ma różne znaczenia w i basic w .ECMAScript W basicpliku odwołanie wsteczne to \1. Odwołanie wsteczne pasuje do zawartości pierwszej grupy przechwytywania (czyli tej, która zaczyna się od i kończy się (b ostatnim ) i pojawia się przed odwołaniem wstecznym), a finał 0 pasuje do zwykłego znaku 0. W ECMAScriptpliku odwołanie wsteczne to \10. Pasuje do dziesiątej grupy przechwytywania, to znaczy tej najbardziej w środku.

Wyrażenie w nawiasie kwadratowym

Wyrażenie w nawiasie kwadratowym definiuje zestaw znaków i sortowanie elementów. Gdy wyrażenie nawiasu zaczyna się od znaku ^ , dopasowanie powiedzie się, jeśli żaden element w zestawie nie pasuje do bieżącego znaku w sekwencji docelowej. W przeciwnym razie dopasowanie się powiedzie, jeśli do bieżącego znaku w sekwencji docelowej pasuje dowolny z elementów w zestawie.

Zestaw znaków można zdefiniować, wyświetlając dowolną kombinację pojedynczych znaków, zakresów znaków, klas znaków, klas równoważności i sortowania symboli.

Grupa przechwytywania

Grupa przechwytywania oznacza swoją zawartość jako pojedynczą jednostkę w gramatyce wyrażeń regularnych i nadaje etykietę tekstowi docelowemu, który pasuje do jej zawartości. Etykieta skojarzona z każdą grupą przechwytywania to numer, który zależy od policzenia nawiasów otwierających, oznaczających grupy przechwytywania, aż do nawiasu otwierającego włącznie, który oznacza bieżącą grupę przechwytywania. W tej implementacji maksymalna liczba grup przechwytywania to 31.

Przykłady:

  • ab+ pasuje do sekwencji "abb"docelowej , ale nie jest zgodna z sekwencją "abab"docelową .

  • (ab)+ nie jest zgodna z sekwencją "abb"docelową , ale pasuje do sekwencji "abab"docelowej .

  • ((a+)(b+))(c+)Dopasuje sekwencję "aabbbc" docelową i kojarzy grupę przechwytywania 1 z podsekwencją "aabbb", grupę przechwytywania 2 z podsekwencją , grupę przechwytywania 3 z grupą "bbb"przechwytywania 4 z podsekwencją "aa""c".

Klasa znaków

Klasa znaków w wyrażeniu w nawiasie kwadratowym dodaje wszystkie znaki w nazwanej klasie do zestawu znaków, który jest zdefiniowany przez wyrażenie w nawiasie kwadratowym. Aby utworzyć klasę znaków, użyj [: następującej po nim nazwy klasy, a następnie :].

Wewnętrznie nazwy klas znaków są rozpoznawane przez wywołanie metody id = traits.lookup_classname. Znak ch należy do takiej klasy, jeśli traits.isctype(ch, id) zwraca wartość true. Szablon domyślny regex_traits obsługuje nazwy klas w poniższej tabeli.

Nazwa klasy opis
alnum małe litery, wielkie litery i cyfry
alpha małe litery i wielkie litery
blank spacja lub tabulator
cntrl znaki ucieczki formatu pliku
digit cyfry
graph małe litery, wielkie litery, cyfry i znaki interpunkcyjne
lower małe litery
print małe litery, wielkie litery, cyfry, znaki interpunkcyjne i spacje
punct znaki interpunkcyjne
space miejsca
upper wielkie litery
xdigit cyfry, a, bcDdBefAC, EF
d tak samo jak digit
s tak samo jak space
w tak samo jak alnum

Zakres znaków

Zakres znaków w wyrażeniu w nawiasie kwadratowym dodaje wszystkie znaki w zakresie do zestawu znaków, który jest zdefiniowany przez wyrażenie w nawiasie kwadratowym. Aby utworzyć zakres znaków, umieść znak '-' między pierwszym i ostatnimi znakami w zakresie. Zakres znaków umieszcza wszystkie znaki, które mają wartość liczbową, która jest większa lub równa wartości liczbowej pierwszego znaku, a do zestawu jest mniejsza lub równa wartości liczbowej ostatniego znaku. Należy zauważyć, że ten zestaw dodanych znaków zależy od reprezentacji znaków specyficznej dla platformy. Jeśli znak '-' występuje na początku lub na końcu wyrażenia nawiasu albo jako pierwszy lub ostatni znak zakresu znaków, reprezentuje sam siebie.

Przykłady:

  • [0-7]reprezentuje zestaw znaków { 0, 1, 342, 5, , 67 } . Pasuje do sekwencji "0"docelowych , "1"i tak dalej, ale nie "a".

  • W systemach używających kodowania [h-k] znaków ASCII reprezentuje zestaw znaków { h, i, j, k }. Pasuje do sekwencji "h"docelowych , "i"i tak dalej, ale nie "\x8A" lub "0".

  • W systemach używających kodowania [h-k] znaków EBCDIC reprezentuje zestaw znaków { h, i, '\x8E''\x8F''\x8D''\x8A''\x8B''\x90''\x8C', , jk } (h jest kodowany jako 0x88 i k jest kodowany jako ).0x92 Pasuje do sekwencji "h"docelowych , "i", "\x8A"i tak dalej, ale nie "0".

  • [-0-24]reprezentuje zestaw znaków { -, , 0, 12, 4 }.

  • [0-2-]reprezentuje zestaw znaków { 0, , 12, - }.

  • W systemach używających kodowania [+--] znaków ASCII reprezentuje zestaw znaków { +,- }.

Gdy używane są zakresy zależne od ustawień regionalnych, znaki w zakresie są określane przez reguły sortowania dla ustawień regionalnych. W zestawie znajdują się znaki, które są sortowane po pierwszym znaku w definicji zakresu i przed ostatnim znakiem w definicji zakresu. Dwa znaki końcowe również znajdują się w zestawie.

Element sortowania

Element sortujący to sekwencja wielu znaków, która jest traktowana jako pojedynczy znak.

Symbol sortowania

Symbol sortowania w wyrażeniu w nawiasie kwadratowym dodaje element sortowania do zestawu zdefiniowanego przez wyrażenie nawiasu. Aby utworzyć symbol sortowania, użyj [. następującego po nim elementu sortowania, a następnie .]

Sekwencja ucieczki sterowania

Sekwencja ucieczki kontrolki to ukośnik odwrotny, po którym następuje litera 'c' , po której następuje jedna z liter 'a' przez 'z' lub 'A' przez 'Z'. Pasuje do znaku kontrolnego ASCII, który jest nazwany przez tę literę. Na przykład "\ci" pasuje do sekwencji "\x09"docelowej , ponieważ ctrl+I ma wartość 0x09.

Ucieczka znaku DSW

Sekwencja unikowa dsw to skrócona nazwa klasy znaków, jak pokazano w poniższej tabeli.

Sekwencja unikowa Równoważna nazwana klasa Domyślna nazwana klasa
\d [[:d:]] [[:digit:]]
\D [^[:d:]] [^[:digit:]]
\s [[:s:]] [[:space:]]
\S [^[:s:]] [^[:space:]]
\w [[:w:]] [a-zA-Z0-9_]*
\W [^[:w:]] [^a-zA-Z0-9_]*

*Zestaw znaków ASCII

Równoważność, klasa

Klasa równoważności w wyrażeniu nawiasu dodaje wszystkie znaki i elementy sortowania, które są równoważne elementowi sortowania w definicji klasy równoważności do zestawu zdefiniowanego przez wyrażenie nawiasu kwadratowego.

Aby utworzyć klasę równoważności, użyj [= elementu sortowania, po którym następuje =]. Wewnętrznie dwa elementy elt1 sortowania i elt2 są równoważne, jeśli traits.transform_primary(elt1.begin(), elt1.end()) == traits.transform_primary(elt2.begin(), elt2.end()).

Ucieczka formatu pliku

Ucieczka formatu pliku składa się ze zwykłych sekwencji ucieczki znaków języka C, \\, \a\n\f\r\b, . \v\t Mają one zwykłe znaczenie, czyli ukośnik odwrotny, alert, backspace, źródło danych formularza, newline, powrót karetki, tabulator poziomy i tabulator pionowy, odpowiednio. W ECMAScriptsystemie \a i \b nie są dozwolone. (\\ jest dozwolony, ale jest to ucieczka tożsamości, a nie ucieczka formatu pliku).

Sekwencja ucieczki szesnastkowej

Sekwencja ucieczki szesnastkowej jest ukośnikiem odwrotnym, po którym następuje litera x , po której następują dwie cyfry szesnastkowe (0-9a-fA-F). Pasuje do znaku w sekwencji docelowej, która ma wartość określoną przez te dwie cyfry.

Na przykład pasuje do sekwencji "a" docelowej, "\x41" gdy jest używane kodowanie znaków ASCII.

Ucieczka tożsamości

Ucieczka tożsamości to odwrotny ukośnik, po którym następuje pojedynczy znak. Pasuje do tego znaku. Jest to wymagane, gdy znak ma specjalne znaczenie. Użycie ucieczki tożsamości usuwa specjalne znaczenie. Przykład:

  • a* pasuje do sekwencji "aaa"docelowej , ale nie jest zgodna z sekwencją "a*"docelową .

  • a\* nie jest zgodna z sekwencją "aaa"docelową , ale pasuje do sekwencji "a*"docelowej .

Zestaw znaków, które są dozwolone w ucieczce tożsamości, zależy od gramatyki wyrażeń regularnych, jak pokazano w poniższej tabeli.

Gramatyka Dozwolone znaki ucieczki tożsamości
basic, grep { (){}.[\*^$ }
extended, egrep { (){.[\*^$+?| }
awk, extended plus { "/ }
ECMAScript Wszystkie znaki z wyjątkiem tych, które mogą być częścią identyfikatora. Zazwyczaj obejmuje to litery, cyfry, $, _i sekwencje ucieczki Unicode. Aby uzyskać więcej informacji, zobacz Specyfikację ECMAScript języka.

Znak indywidualny

Pojedynczy znak w wyrażeniu w nawiasie kwadratowym dodaje ten znak do zestawu znaków, który jest zdefiniowany przez wyrażenie w nawiasie kwadratowym. Dowolne miejsce w wyrażeniu w nawiasie kwadratowym, z wyjątkiem początku, ^ reprezentuje siebie.

Przykłady:

  • [abc] pasuje do sekwencji "a"docelowych , "b"i "c", ale nie sekwencji "d".

  • [^abc]pasuje do sekwencji docelowej , ale nie sekwencji "d""a"docelowych , "b"lub "c".

  • [a^bc]pasuje do sekwencji "a"docelowych , , "b""c"i "^", ale nie sekwencji "d"docelowej .

We wszystkich gramatykach wyrażeń regularnych z wyjątkiem ECMAScript, jeśli jest ] to pierwszy znak, który następuje po otwarciu [ lub jest pierwszym znakiem, który następuje po początkowym ^, reprezentuje się.

Przykłady:

  • []a jest nieprawidłowy, ponieważ nie ma ] końca wyrażenia w nawiasie kwadratowym.

  • []abc]pasuje do sekwencji "a"docelowych , , "b""c"i "]", ale nie sekwencji "d"docelowej .

  • [^]abc] dopasuje sekwencję "d"docelową , ale nie sekwencje "a"docelowe , "b", "c"lub "]".

W ECMAScriptpliku użyj polecenia \] , aby reprezentować znak ] w wyrażeniu w nawiasie kwadratowym.

Przykłady:

  • []a pasuje do sekwencji "a" docelowej, ponieważ wyrażenie nawiasu jest puste.

  • [\]abc]dopasuje sekwencje "a"docelowe , , "b""c"i"]", ale nie sekwencję "d"docelową .

Asercja ujemna

Asercja negatywna pasuje do wszystkiego oprócz swojej zawartości. Nie używa żadnych znaków w sekwencji docelowej.

Na przykład (!aa)(a*) pasuje do sekwencji "a" docelowej i kojarzy grupę przechwytywania 1 z podsekwencją "a". Nie jest zgodna z sekwencją docelową ani sekwencją "aa""aaa"docelową .

Asercja granicy wyrazów ujemnych

Asercja granicy wyrazów ujemnych jest zgodna, jeśli bieżące położenie w ciągu docelowym nie jest natychmiast po granicy słowa.

Grupa nieuchwytna

Grupa nieuchwytna oznacza jego zawartość jako pojedynczą jednostkę w gramatyce wyrażeń regularnych, ale nie oznacza tekstu docelowego.

Na przykład dopasuje (a)(?:b)*(c) tekst "abbc" docelowy i kojarzy grupę przechwytywania 1 z podsekwencją "a" i grupą przechwytywania 2 z podsekwencją "c".

Powtórzenie niechłanne

Powtórzenie niezachłanne używa najkrótszej podsekwencji sekwencji docelowej, która pasuje do wzorca. Powtórzenie zachłanne używa najdłuższej. Na przykład pasuje (a+)(a*b) do sekwencji "aaab"docelowej .

Gdy jest używane powtórzenie niechłanne, kojarzy grupę przechwytywania 1 z podsekwencją "a" na początku sekwencji docelowej i grupę przechwytywania 2 z podsekwencją "aab" na końcu sekwencji docelowej.

Gdy używany jest chciwy mecz, kojarzy grupę przechwytywania 1 z podsekwencją "aaa" i grupą przechwytywania 2 z podsekwencją "b".

Sekwencja ucieczki ósemkowej

Ósemkowa sekwencja unikowa to ukośnik odwrotny, po którym następuje jedna, dwie lub trzy cyfry ósemkowe (0-7). Pasuje do znaku w sekwencji docelowej, który ma wartość określoną przez te cyfry. Jeśli wszystkie cyfry to 0, sekwencja jest nieprawidłowa.

Na przykład pasuje do sekwencji "a" docelowej, \101 gdy jest używane kodowanie znaków ASCII.

Zwykły znak

Zwykły znak jest dowolnym prawidłowym znakiem, który nie ma specjalnego znaczenia w bieżącej gramatyki.

W ECMAScriptpliku następujące znaki mają specjalne znaczenie:

  • ^ $ \ . * + ? ( ) [ ] { } |

W basic znakach i grepnastępujące znaki mają specjalne znaczenie:

  • . [ \

Ponadto w znakach basic i grepnastępujące znaki mają specjalne znaczenie, gdy są używane w określonym kontekście:

  • * ma specjalne znaczenie we wszystkich przypadkach, z wyjątkiem sytuacji, gdy jest to pierwszy znak w wyrażeniu regularnym lub pierwszy znak, który następuje po początkowym ^ w wyrażeniu regularnym, lub gdy jest to pierwszy znak grupy przechwytywania lub pierwszy znak, który następuje po początkowym ^ znaku w grupie przechwytywania.

  • ^ ma specjalne znaczenie, gdy jest to pierwszy znak wyrażenia regularnego.

  • $ ma specjalne znaczenie, gdy jest to ostatni znak wyrażenia regularnego.

W extendedelementach , egrepi awknastępujące znaki mają specjalne znaczenie:

  • . [ \ ( * + ? { |

Ponadto w extendedznakach , egrepi awknastępujące znaki mają specjalne znaczenie, gdy są używane w określonym kontekście.

  • ) ma specjalne znaczenie, gdy pasuje do poprzedniego (

  • ^ ma specjalne znaczenie, gdy jest to pierwszy znak wyrażenia regularnego.

  • $ ma specjalne znaczenie, gdy jest to ostatni znak wyrażenia regularnego.

Zwykły znak pasuje do takiego samego znaku w sekwencji docelowej. Domyślnie oznacza to, że dopasowanie się powiedzie, jeśli dwa znaki są reprezentowane przez tę samą wartość. W przypadku dopasowania bez uwzględniania wielkości liter dwa znaki ch0 i ch1 są zgodne, jeśli traits.translate_nocase(ch0) == traits.translate_nocase(ch1). W dopasowaniu uwzględniającym ustawienia regionalne dwa znaki ch0 i ch1 dopasuj je, jeśli traits.translate(ch0) == traits.translate(ch1).

Asercja dodatnia

Asercja dodatnia pasuje do jego zawartości, ale nie używa żadnych znaków w sekwencji docelowej.

Przykłady:

  • (=aa)(a*) dopasuje sekwencję "aaaa" docelową i kojarzy grupę przechwytywania 1 z podsekwencją "aaaa".

  • (aa)(a*) Dopasuje sekwencję "aaaa" docelową i kojarzy grupę przechwytywania 1 z podsekwencją "aa" na początku sekwencji docelowej i grupę przechwytywania 2 z podsekwencją "aa" na końcu sekwencji docelowej.

  • (=aa)(a)|(a) dopasowuje sekwencję docelową i kojarzy grupę przechwytywania 1 z pustą sekwencją (ponieważ pozytywna asercja "a" nie powiodła się) i grupą przechwytywania 2 z podsekwencją "a". Pasuje również do sekwencji "aa" docelowej i kojarzy grupę przechwytywania 1 z podsekwencją "aa" i grupą przechwytywania 2 z pustą sekwencją.

Sekwencja ucieczki Unicode

Sekwencja ucieczki Unicode to ukośnik odwrotny, po którym następuje litera 'u' z czterema cyframi szesnastkowymi (0-9a-fA-F). Pasuje do znaku w sekwencji docelowej, który ma wartość określoną przez te cztery cyfry. Na przykład pasuje do sekwencji "a" docelowej, \u0041 gdy jest używane kodowanie znaków ASCII.

Symbol wieloznaczny

Symbol wieloznaczny pasuje do dowolnego znaku w wyrażeniu docelowym z wyjątkiem nowego wiersza.

Granica wyrazów

Granica słowa występuje w następujących sytuacjach:

  • Bieżący znak znajduje się na początku sekwencji docelowej i jest jednym z znaków słowa A-Za-z0-9_

  • Bieżąca pozycja znaku jest poza końcem sekwencji docelowej, a ostatni znak w sekwencji docelowej jest jednym ze znaków słowa.

  • Bieżący znak jest jednym z znaków słowa, a poprzedni znak nie jest.

  • Bieżący znak nie jest jednym ze znaków słowa, a poprzedni znak jest.

Asercja granicy programu Word

Asercja granicy wyrazu jest zgodna, gdy bieżące położenie w ciągu docelowym jest natychmiast po granicy słowa.

Dopasowywanie i wyszukiwanie

Aby wyrażenie regularne pasowało do sekwencji docelowej, całe wyrażenie regularne musi pasować do całej sekwencji docelowej. Na przykład wyrażenie bcd regularne pasuje do sekwencji docelowej, ale nie jest zgodne z sekwencją "bcd" docelową ani sekwencją "abcd""bcde"docelową .

Aby wyszukiwanie wyrażenia regularnego zostało wykonane pomyślnie, gdzieś w sekwencji docelowej musi istnieć podsekwencja, która odpowiada wyrażeniu regularnemu. Wyszukiwanie znajduje zazwyczaj pasującą podsekwencję najbliżej lewej strony.

Przykłady:

  • Wyszukiwanie wyrażenia bcd regularnego w sekwencji "bcd" docelowej kończy się powodzeniem i pasuje do całej sekwencji. To samo wyszukiwanie w sekwencji "abcd" docelowej również powiedzie się i pasuje do ostatnich trzech znaków. To samo wyszukiwanie w sekwencji "bcde" docelowej również powiedzie się i pasuje do pierwszych trzech znaków.

  • Wyszukiwanie wyrażenia bcd regularnego w sekwencji "bcdbcd" docelowej kończy się powodzeniem i pasuje do pierwszych trzech znaków.

Jeśli w sekwencji docelowej istnieje więcej niż jedna podsekwencja zgodna z jedną lokalizacją, istnieją dwa sposoby wybierania pasującego wzorca.

Pierwsze dopasowanie wybiera podsekwencję, która została znaleziona jako pierwsza po dopasowaniu wyrażenia regularnego.

Najdłuższe dopasowanie wybiera najdłuższą podsekwencję spośród tych, które są zgodne w tej lokalizacji. Jeśli istnieje więcej niż jedna podsekwencja, która ma maksymalną długość, najdłuższe dopasowanie wybiera ten, który został znaleziony jako pierwszy.

Na przykład gdy jest używane pierwsze dopasowanie, wyszukiwanie wyrażenia b|bc regularnego w sekwencji "abcd" docelowej jest zgodne z podsekwencją "b" , ponieważ termin po lewej stronie zmiennej pasuje do tego podsekwencji; dlatego pierwsze dopasowanie nie próbuje od prawej strony terminu zmiany. Jeśli jest używane najdłuższe dopasowanie, to samo wyszukiwanie jest zgodne "bc" , ponieważ "bc" jest dłuższe niż "b".

Częściowe dopasowanie powiedzie się, jeśli dopasowanie osiągnie koniec sekwencji docelowej bez niepowodzenia, nawet jeśli nie osiągnęło końca wyrażenia regularnego. W związku z tym, po pomyślnym częściowym wystąpieniu, dodanie znaków do sekwencji docelowej mogłoby spowodować niepowodzenie późniejszego częściowego wystąpienia. Jednak po częściowym dopasowaniu nie powiedzie się, dołączanie znaków do sekwencji docelowej nie może spowodować późniejszego częściowego dopasowania. Na przykład z częściowym dopasowaniem pasuje do sekwencji docelowej, ab ale nie "ac"."a"

Flagi formatowania

ECMAScript Formatowanie reguł Reguły formatu sed Tekst zastępczy
$& & Sekwencja znaków zgodna z całym wyrażeniem regularnym: [match[0].first, match[0].second)
$$ $
\& &
$`" (znak dolara, po którym następuje cudzysłów wsteczny) Sekwencja znaków poprzedzającą podsekwencję zgodną z wyrażeniem regularnym: [match.prefix().first, match.prefix().second)
$'" (znak dolara, po którym następuje cudzysłów) Sekwencja znaków zgodna z podsekwencją zgodną z wyrażeniem regularnym: [match.suffix().first, match.suffix().second)
$n \n Sekwencja znaków zgodna z grupą przechwytywania w pozycji n, gdzie n jest liczbą z zakresu od 0 do 9: [match[n].first, match[n].second)
\\n \n
$nn Sekwencja znaków zgodna z grupą przechwytywania w pozycji nn, gdzie nn jest liczbą z zakresu od 10 do 99: [match[nn].first, match[nn].second)

Zobacz też

Standardowa biblioteka C++ — przegląd