Regulární výrazy (C++)

Standardní knihovna C++ podporuje několik gramatik regulárních výrazů. Toto téma popisuje gramatické variace, které jsou k dispozici při použití regulárních výrazů.

Gramatika regulárního výrazu

Gramatika regulárního výrazu, která se má použít, je určena použitím jedné z std::regex_constants::syntax_option_type hodnot výčtu. Tyto gramatiky regulárních výrazů jsou definovány v std::regex_constants :

  • ECMAScript: Toto je nejblíže gramatice používané v jazycích JavaScript a .NET.
  • basic: basic Regulární výrazy POSIX nebo BRE.
  • extended: extended Regulární výrazy POSIX nebo ere.
  • awk: To je extended , ale obsahuje více řídicích znaků pro netisknutelné znaky.
  • grep: To je basic , ale zároveň umožňuje \n oddělit střídající se znaky nového řádku ().
  • e grep : to je extended , ale také umožňuje, aby znaky nového řádku oddělovat střídající se.

Ve výchozím nastavení platí, že pokud není zadána žádná gramatika, ECMAScript předpokládá se. Může být zadána pouze jedna gramatika.

Lze také použít několik příznaků:

  • icase: Ignorovat velikost písmen při shodě.
  • nosubs: Ignorovat označené shody (tj. výrazy v závorkách); neukládají se žádné náhrady.
  • optimize: Zajištění rychlejšího porovnání s možnými náklady na vyšší dobu stavby.
  • collate: Použijte posloupnosti kolace závislé na národním prostředí (například rozsahy formuláře [a-z] ).

K určení chování modulu regulárních výrazů lze kombinovat nula nebo více příznaků s gramatikou. Pokud jsou zadány pouze příznaky, ECMAScript je považována za gramatiku.

Prvek

Element může být jeden z následujících:

  • Běžný znak , který odpovídá stejnému znaku v cílové sekvenci.

  • Zástupný znak , který odpovídá jakémukoli znaku v cílové sekvenci s výjimkou nového řádku.

  • Výraz v závorkách , který odpovídá znaku nebo prvku kolace v cílové sekvenci, která je také v množině definované výrazem expr nebo ve formuláři [^expr] , který odpovídá znaku nebo prvku kolace v cílové sekvenci, která není v množině definované výrazem expr .

    Výraz expr může obsahovat libovolnou kombinaci následujících možností:

    • Jednotlivý znak. Přidá znak do množiny definované expr .

    • Rozsah znaků formuláře . Přidá znaky, které jsou reprezentovány hodnotami v zavřeném rozsahu, [ch1, ch2] do množiny definované expr .

    • Třída znaků ve formátu . Přidá znaky v pojmenované třídě do množiny definované expr .

    • Třída ekvivalence formuláře . Přidá prvky kompletování, které jsou ekvivalentní elt k sadě definované pomocí expr .

    • Symbol kompletování formuláře . Přidá element kolace elt do množiny definované expr .

  • Kotva. Kotva ^ odpovídá začátku cílové sekvence. Kotva $ odpovídá konci cílové sekvence.

Skupina zachycení formuláře (dílčívýraz) nebo \ (podvýraz\) v a , která odpovídá sekvenci znaků v cílové sekvenci, která je shodná se vzorem mezi oddělovači.

  • Řídicí znak identity formuláře , který odpovídá znaku k v cílové sekvenci.

Příklady:

  • a odpovídá cílové sekvenci "a" , ale neodpovídá cílovým sekvencím "B" , "b" nebo "c" .

  • . odpovídá všem cílovým sekvencím "a" , "B" , "b" a "c" .

  • [b-z] odpovídá cílovým sekvencím "b" , "c" ale neodpovídá cílovým sekvencím "a" nebo "B" .

  • [:lower:] odpovídá cílovým sekvencím "a" , "b" a, "c" ale neodpovídá cílové sekvenci "B" .

  • (a) odpovídá cílové sekvenci "a" a přidruží skupinu zachycení 1 k dílčí sekvenci "a" , ale neodpovídá cílovým sekvencím "B" , "b" nebo "c" .

V systému ECMAScript , basic , a grep , může být prvek také ECMAScript formuláře \dd , kde dd představuje desítkovou hodnotu N, která odpovídá sekvenci znaků v cílové sekvenci, která je stejná jako sekvence znaků, které jsou porovnány n-tý basic.

Například (a)\1 odpovídá cílové sekvenci, "aa" protože první (a jediná) skupina zachycení odpovídá počáteční sekvenci "a" a potom \1 odpovídá konečné sekvenci "a" .

V nástroji ECMAScript může být prvek také jedním z následujících:

  • Skupina bez zachycení formuláře (?: dílčí výraz). Odpovídá sekvenci znaků v cílové sekvenci, které odpovídá vzorec mezi oddělovači.

  • Omezený řídicí znak formátu souboru ve formátu ,,, \n\r\t nebo \v . Tyto odpovídají znaku posunu strany, novému řádku, návratovému znaku, horizontálnímu, resp. vertikálnímu tabulátoru v cílové sekvenci.

  • Kladný kontrolní výraz formuláře (= podvýraz). Odpovídá sekvenci znaků v cílové sekvenci, která odpovídá vzoru mezi oddělovači, ale nemění pozici shody v cílové sekvenci.

  • Negativní kontrolní výraz formuláře (! dílčí výraz). Odpovídá libovolné sekvenci znaků v cílové sekvenci, která neodpovídá vzoru mezi oddělovači a nemění pozici shody v cílové sekvenci.

  • Hexadecimální řídicí sekvence formuláře . Odpovídá znaku v cílové sekvenci, který je reprezentován dvěma šestnáctkovými číslicemi hh .

  • Řídicí sekvence Unicode ve formátu . Odpovídá znaku v cílové sekvenci, který je reprezentován čtyřmi šestnáctkovými číslicemi hhhh .

  • Řídicí sekvence ovládacího prvku formuláře . Odpovídá řídicímu znaku, který je pojmenován znakem k .

  • Kontrolní výraz hranice slova ve formuláři . Odpovídá, pokud aktuální pozice v cílové sekvenci je ihned za hranicí slova.

  • Negativní kontrolní výraz hranice slova ve formuláři . Odpovídá, pokud aktuální pozice v cílové sekvenci není hned za hranicí slova.

  • Řídicí znak dsw znaku formuláře ,,, \D , \s\S\w , \W . Poskytuje krátký název pro třídu znaků.

Příklady:

  • (?:a) odpovídá cílové sekvenci "a" , ale "(?:a)\1" je neplatný, protože není k dispozici žádná skupina zachycení 1.

  • (=a)a odpovídá cílové sekvenci "a" . Kladný kontrolní výraz odpovídá počáteční sekvenci "a" v cílové sekvenci a konečný "a" v regulárním výrazu odpovídá počáteční sekvenci "a" v cílové sekvenci.

  • (!a)a neodpovídá cílové sekvenci "a" .

  • a\b. odpovídá cílové sekvenci "a~" , ale neodpovídá cílové sekvenci "ab" .

  • a\B. odpovídá cílové sekvenci "ab" , ale neodpovídá cílové sekvenci "a~" .

V nástroji awk může být prvek také jedním z následujících:

  • Řídicí znak formátu souboru formuláře,,,,, \a\b\f\n\r , \t nebo \v . Tyto odpovídají zpětnému lomítku, upozornění, klávese Backspace, znaku posunu strany, novému řádku, návratovému znaku, horizontálnímu, resp. vertikálnímu tabulátoru v cílové sekvenci.

  • Osmičková řídicí sekvence formuláře . Odpovídá znaku v cílové sekvenci, jejíž reprezentace je hodnota reprezentovaná jednou, dvěma nebo tři osmičkovou číslicí ooo .

Opakování

Libovolný element jiný než kladný kontrolnívýraz, negativní kontrolnívýraz nebo ukotvení může následovat po počtu opakování. Nejobecnější typ opakování má podobu {min,Max} nebo \ {min,Max\} v a . Element, za nímž následuje tento tvar počtu opakování, odpovídá alespoň minimálnímu počtu po sobě jdoucích výskytů a žádnému více než maximálnímu počtu úspěšných výskytů sekvence, která odpovídá prvku.

Například a{2,3} odpovídá cílové sekvenci "aa" a cílové sekvenci "aaa" , ale nikoli cílové sekvenci "a" nebo cílové sekvenci "aaaa" .

Počet opakování může mít také jednu z následujících forem:

  • {min} nebo \ {min} v a . Odpovídá hodnotě {min,min}.

  • {min,} nebo \ {min, \} v a . Odpovídá hodnotě {min,Unbounded}.

  • * je ekvivalentní k {0,*}.

Příklady:

  • a{2} odpovídá cílové sekvenci, "aa" ale nikoli cílové sekvenci "a" nebo cílové sekvenci "aaa" .

  • a{2,} odpovídá cílové sekvenci "aa" , cílové sekvenci atd "aaa" ., ale neodpovídá cílové sekvenci "a" .

  • a* odpovídá cílové sekvenci "" , cílové sekvenci "a" , cílové sekvenci atd "aa" .

Pro všechny gramatiky s výjimkou basic a grep může mít počet opakování také jednu z následujících forem:

  • ? je ekvivalentem k {0,1}.

  • + je ekvivalentní k {1,+}.

Příklady:

  • a? odpovídá cílové sekvenci "" a cílové sekvenci "a" , ale nikoli cílové sekvenci "aa" .

  • a+ odpovídá cílové sekvenci "a" , cílové sekvenci atd "aa" ., ale nikoli cílové sekvenci "" .

V nástroji ECMAScript mohou být všechny formy počtu opakování následovány znakem, ? který označuje ECMAScript.

Zřetězení

Prvky regulárního výrazu s počtem opakovánínebo bez nich lze zřetězit, aby bylo možné vytvořit delší regulární výrazy. Výsledný výraz odpovídá cílové sekvenci, která je zřetězením sekvencí odpovídajících jednotlivým prvkům.

Například a{2,3}b odpovídá cílové sekvenci "aab" a cílové sekvenci "aaab" , ale neodpovídá cílové sekvenci "ab" nebo cílové sekvenci "aaaab" .

Alternace

Ve všech gramatikách regulárních výrazů s výjimkou basic a grep může být zřetězený regulární výraz následován znakem | (kanál) a jiným zřetězeným regulárním výrazem. Tímto způsobem lze spojit libovolný počet zřetězených regulárních výrazů. Výsledný výraz odpovídá jakékoli cílové sekvenci, která odpovídá jednomu nebo více zřetězeným regulárním výrazům.

Pokud se více než jeden ze zřetězených regulárních výrazů shoduje s cílovou sekvencí, ECMAScript zvolí první z zřetězených regulárních výrazů, které odpovídají sekvenci jako shoda, která bude označována jako ECMAScript. Jiné gramatiky regulárních výrazů zvolí ten, který dosáhne nejdelší shody.

Například ab|cd odpovídá cílové sekvenci "ab" a cílové sekvenci "cd" , ale neodpovídá cílové sekvenci "abd" nebo cílové sekvenci "acd" .

V grep a e grep se dá znak nového řádku ( \n ) použít k oddělení střídajících se.

Dílčí výraz

V basic a grep je dílčí výraz zřetězení. V ostatních gramatikách regulárního výrazu je dílčí výraz změnou.

Souhrn gramatiky

Následující tabulka shrnuje funkce, které jsou k dispozici v různých gramatikách regulárního výrazu:

Prvek basic extended ECMAScript grep cerebrálnígrep awk
alternace pomocí | + + + +
alternace pomocí \n + +
ukotvení + + + + + +
zpětný odkaz + + +
výraz závorky + + + + + +
zachytit skupinu pomocí () + + + +
zachytit skupinu pomocí \(\) + +
řídicí sekvence +
řídicí znak dsw +
řídicí znak formátu souboru + +
šestnáctková řídicí sekvence +
řídicí znak identity + + + + + +
záporný kontrolní výraz +
záporný kontrolní výraz hranice slova +
skupina bez zachycení +
opakování bez metody Greedy +
osmičková řídicí sekvence +
běžný znak + + + + + +
Kladný kontrolní výraz +
opakování pomocí {} + + + +
opakování pomocí \{\} + +
opakování pomocí * + + + + + +
opakování pomocí ? a + + + + +
řídicí sekvence Unicode +
zástupný znak + + + + + +
kontrolní výraz hranice slova +

Sémantické podrobnosti

Ukotvení

Ukotvení odpovídá pozici v cílovém řetězci, nikoli znaku. ^Odpovídá začátku cílového řetězce a $ odpovídá konci cílového řetězce.

Zpětný odkaz

Zpětný odkaz je zpětné lomítko, po kterém následuje Desítková hodnota N. Odpovídá obsahu n-tý skupiny zachycení. Hodnota N nesmí být větší než počet skupin zachycení, které zpětnému odkazu předcházejí. V basic a grep je hodnota N určena desítkovou číslicí, která následuje po zpětném lomítku. V ECMAScript , hodnota N je určena všemi desítkovými číslicemi, které bezprostředně následují zpětné lomítko. Proto basicgrep hodnota N není nikdy více než 9, a to i v případě, že má regulární výraz více než devět skupin zachycení. V ECMAScript není hodnota N ohraničena.

Příklady:

  • ((a+)(b+))(c+)\3 odpovídá cílové sekvenci "aabbbcbbb" . Zpětný odkaz \3 odpovídá textu ve třetí skupině zachycení, tedy "(b+)" . Neodpovídá cílové sekvenci "aabbbcbb" .

  • (a)\2 není platná.

  • (b(((((((((a))))))))))\10 má jiné významy v basic a ECMAScript . V je basic zpětný odkaz \1 . Zpětný odkaz odpovídá obsahu první skupiny zachycení (to znamená, ta, která začíná (b a končí na konci ) a je před zpětným odkazem) a poslední se 0 shoduje s běžným znakem 0 . V je ECMAScript zpětný odkaz \10 . Odpovídá desáté skupině zachycení, tedy té nejvíce uvnitř.

Výraz závorky

Výraz závorky definuje sadu znaků a kompletování prvků. Pokud výraz v závorkách začíná znakem ^ , shoda se zdaří, pokud žádné elementy v sadě neodpovídají aktuálnímu znaku v cílové sekvenci. Porovnání je jinak úspěšné, pokud jakýkoli z prvků v množině odpovídá aktuálnímu prvku v cílové sekvenci.

Sadu znaků lze definovat výpisem jakékoli kombinace jednotlivých znaků, rozsahů znaků, tříd znaků, tříd ekvivalencea řazení symbolů.

Skupina zachycení

Skupina zachycení označuje svůj obsah jako jednu jednotku v gramatice regulárního výrazu a označuje popiskem cílový text, který odpovídá jejímu obsahu. Popisek, který je spojen s každou skupinou zachycení, je číslo, které je určeno výpočtem úvodních závorek, jež označují skupiny zachycení až do úvodní závorky včetně, která označuje aktuální skupinu zachycení. V této implementaci je maximální počet skupin zachycení 31.

Příklady:

  • ab+ odpovídá cílové sekvenci "abb" , ale neodpovídá cílové sekvenci "abab" .

  • (ab)+ neodpovídá cílové sekvenci "abb" , ale odpovídá cílové sekvenci "abab" .

  • ((a+)(b+))(c+) odpovídá cílové sekvenci "aabbbc" a přidruží skupinu zachycení 1 k dílčí sekvenci "aabbb" , skupině zachycení 2 k dílčí sekvenci "aa" , skupině zachycení 3 s "bbb" a skupině zachycení 4 s podsekvencí "c" .

Třída znaků

Třída znaků ve výrazu závorky přidá všechny znaky v pojmenované třídě do množiny znaků, která je definována výrazem závorky. Chcete-li vytvořit třídu znaků, použijte [: následovaný názvem třídy následovaný :] .

Interně jsou názvy tříd znaků rozpoznávány voláním id = traits.lookup_classname . Znak ch patří do takové třídy, pokud traits.isctype(ch, id) vrátí hodnotu true. Výchozí regex_traits šablona podporuje názvy tříd v následující tabulce.

Název třídy Popis
alnum malá písmena, velká písmena a číslice
alpha malá písmena a velká písmena
blank mezera nebo tabulátor
cntrl řídicí znaky formátu souboru
digit číslice
graph malá písmena, velká písmena, číslice a interpunkce
lower malá písmena
print malá písmena, velká písmena, číslice, interpunkce a mezera
punct interpunkce
space mezera
upper velká písmena
xdigit číslice,,,,,,,, abcdefAB , C , D , E , F
d stejné jako digit
s stejné jako space
w stejné jako alnum

Rozsah znaků

Rozsah znaků ve výrazu závorky přidá všechny znaky v rozsahu do množiny znaků, která je definována výrazem závorky. Chcete-li vytvořit rozsah znaků, vložte znak '-' mezi první a poslední znak v rozsahu. Rozsah znaků vloží všechny znaky, které mají číselnou hodnotu, která je větší nebo rovna číselné hodnotě prvního znaku a menší nebo rovna číselné hodnotě posledního znaku, do množiny. Všimněte si, že tato množina přidaných znaků závisí na reprezentaci znaků konkrétní platformy. Pokud znak '-' vznikne na začátku nebo konci výrazu závorky nebo jako první nebo poslední znak rozsahu znaků, představuje sám sebe.

Příklady:

  • [0-7] představuje sadu znaků { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 }. Odpovídá cílovým sekvencím "0" , "1" a tak dále, ale ne "a" .

  • V systémech, které používají kódování znaků ASCII, [h-k] představuje sadu znaků { h , i , j , k }. Odpovídá cílovým sekvencím "h" , "i" a tak dále, ale ne "\x8A" nebo "0" .

  • V systémech, které používají kódování znaků EBCDIC, [h-k] představuje sadu znaků { h , i , '\x8A' , '\x8B' , '\x8C' , '\x8D' , '\x8E' , '\x8F' , '\x90' , j , k } ( h je kódována jako 0x88 a k je kódována jako 0x92 ). Odpovídá cílovým sekvencím "h" , "i" , "\x8A" a tak dále, ale ne "0" .

  • [-0-24] představuje sadu znaků { - , 0 , 1 , 2 , 4 }.

  • [0-2-] představuje sadu znaků { 0 , 1 , 2 , - }.

  • V systémech, které používají kódování znaků ASCII, [+--] představuje sadu znaků { +,- }.

Pokud používáte rozsahy citlivé na národní prostředí, jsou znaky v rozsahu určeny kolačními pravidly pro dané národní prostředí. V šabloně jsou znaky, které se kompletují za prvním znakem v definici rozsahu a před posledním znakem v definici rozsahu. V množině jsou také dva koncové znaky.

Kompletování elementu

Kolační prvek je sekvence více znaků, která je zpracovávána jako jeden znak.

Symbol kompletování

Symbol kompletování ve výrazu závorky přidá prvek kompletování do sady, která je definována výrazem závorky. Chcete-li vytvořit symbol kompletování, použijte [. následovaný elementem kompletování následovaným .]

Řídicí sekvence ovládacího prvku

Řídicí sekvence ovládacího prvku je zpětné lomítko následované písmenem 'c' následovaným jedním ze písmen 'a''z' nebo 'A' přes 'Z' . Odpovídá řídicímu znaku ASCII, který je pojmenován podle daného písmena. Například "\ci" odpovídá cílové sekvenci "\x09" , protože Ctrl + I má hodnotu 0x09 .

Řídicí znak DSW

Řídicí znak dsw je krátký název pro třídu znaků, jak je znázorněno v následující tabulce.

Řídicí sekvence Třída s ekvivalentním názvem Třída s výchozím názvem
\d [[:d:]] [[:digit:]]
\D [^[:d:]] [^[:digit:]]
\s [[:s:]] [[:space:]]
\S [^[:s:]] [^[:space:]]
\w [[:w:]] [a-zA-Z0-9_]*
\W [^[:w:]] [^a-zA-Z0-9_]*

* Znaková sada ASCII

Ekvivalence – třída

Třída ekvivalence ve výrazu závorky přidá všechny znaky a kompletování prvků , které jsou ekvivalentní prvku kompletování v definici třídy ekvivalence, do sady, která je definována výrazem závorky.

Chcete-li vytvořit třídu ekvivalence, použijte [= následovanou kompletující element následovaný =] . Interně dva prvky kompletování elt1 a elt2 jsou ekvivalentní, pokud traits.transform_primary(elt1.begin(), elt1.end()) == traits.transform_primary(elt2.begin(), elt2.end()) .

Řídicí znak formátu souboru

Řídicí znak formátu souboru se skládá z obvyklých řídicích sekvencí znaků jazyka C,,,, \\\a\b\f , \n , \r , \t , \v . Jedná se o běžné významy, tedy zpětné lomítko, výstrahu, Backspace, znak formuláře, nový řádek, návrat do konce řádku, horizontální tabulátor a svislá karta v uvedeném pořadí. V ECMAScript\a a \b nejsou povoleny. ( \\ je povolený, ale je to řídicí znak identity, ne řídicí znak formátu souboru).

Šestnáctková řídicí sekvence

Šestnáctková řídicí sekvence je zpětné lomítko následované písmenem x následovaným dvěma šestnáctkovými číslicemi ( 0-9a-fA-F ). Odpovídá znaku v cílové sekvenci, který má hodnotu určenou pomocí dvou číslic.

Například "\x41" odpovídá cílové sekvenci, "a" když se používá kódování znaků ASCII.

Řídicí znak identity

Řídicí znak identity je zpětné lomítko následované jedním znakem. Odpovídá danému znaku. Vyžaduje se, pokud má znak zvláštní význam. Použití řídicího znaku identity odstraní zvláštní význam. Například:

  • a* odpovídá cílové sekvenci "aaa" , ale neodpovídá cílové sekvenci "a*" .

  • a\* neodpovídá cílové sekvenci "aaa" , ale odpovídá cílové sekvenci "a*" .

Množina znaků, které jsou v řídicím znaku identity povoleny, závisí na gramatice regulárního výrazu, viz následující tabulka.

Gramatika Povolené řídicí znaky identity
basic, grep { (){}.[\*^$ }
extended, egrep { (){.[\*^$+?| }
awk, extended plus { "/ }
ECMAScript Všechny znaky kromě těch, které mohou být součástí identifikátoru. Obvykle to zahrnuje písmena, číslice,, $ a _ řídicí sekvence Unicode. Další informace najdete v tématu ECMAScript specifikace jazyka.

Individuální znak

Jednotlivý znak ve výrazu závorky přidá daný znak do množiny znaků, která je definována výrazem závorky. Kdekoli ve výrazu závorky, kromě na začátku, ^ představuje sám sebe.

Příklady:

  • [abc] odpovídá cílovým sekvencím, "a""b" , a "c" nikoli sekvenci "d" .

  • [^abc] odpovídá cílové sekvenci "d" , ale nikoli cílovým sekvencím "a" , "b" nebo "c" .

  • [a^bc] odpovídá cílovým sekvencím "a" ,, "b""c" a "^" , ale nikoli cílové sekvenci "d" .

Ve všech gramatikách regulárních výrazů s výjimkou ECMAScript , pokud ] je první znak, který následuje po otevření, [ nebo je prvním znakem, který následuje jako počáteční ^ , představuje sám sebe.

Příklady:

  • []a je neplatný, protože neexistuje žádná ] koncová závorka výrazu.

  • []abc] odpovídá cílovým sekvencím "a" ,, "b""c" a "]" , ale nikoli cílové sekvenci "d" .

  • [^]abc] odpovídá cílové sekvenci "d" , ale nikoli cílovým sekvencím "a" ,, "b""c" nebo "]" .

V aplikaci lze ECMAScript použít \] k reprezentaci znaku ] ve výrazu závorky.

Příklady:

  • []a odpovídá cílové sekvenci, "a" protože výraz závorky je prázdný.

  • [\]abc] odpovídá cílovým sekvencím "a" , "b" , "c" , a, "]" ale nikoli cílové sekvenci "d" .

Negativní kontrolní výraz

Záporný kontrolní výraz odpovídá všemu kromě svého obsahu. Nespotřebovává žádné znaky v cílové sekvenci.

Například (!aa)(a*) odpovídá cílové sekvenci "a" a přidruží skupinu zachycení 1 k dílčí sekvenci "a" . Neodpovídá cílové sekvenci "aa" nebo cílové sekvenci "aaa" .

Negativní kontrolní výraz hranice slova

Negativní kontrolní výraz hranice slova odpovídá, pokud aktuální pozice v cílovém řetězci není hned za hranicí slova.

Skupina bez zachycení

Skupina bez zachycení označí svůj obsah jako jednu jednotku v gramatice regulárního výrazu, ale neoznačí cílový text.

Například (a)(?:b)*(c) odpovídá cílovému textu "abbc" a přidruží skupinu zachycení 1 k dílčí sekvenci "a" a skupině zachycení 2 k dílčí sekvenci "c" .

Opakující se opakování

Opakování bez metody Greedy spotřebovává nejkratší dílčí sekvenci cílové sekvence, která odpovídá vzoru. Opakování s metodou Greedy spotřebovává nejdelší sekvenci. Například odpovídá (a+)(a*b) cílové sekvenci "aaab" .

Pokud se použije opakování bez greedy, přidruží skupinu zachycení 1 k dílčí sekvenci na začátku cílové sekvence a skupinu zachycení 2 k dílčí sekvenci na konci cílové "a""aab" sekvence.

Když se použije shoda s greedy, přidruží skupinu zachycení 1 k dílčí sekvenci a skupinu zachycení 2 k "aaa" dílčí sekvenci "b" .

Osmičkové řídicí sekvence

Osmičková řídicí sekvence je zpětné lomítko následované jednou, dvěma nebo třemi osmičkovými číslicemi (0-7). Odpovídá znaku v cílové sekvenci, který má hodnotu určenou pomocí těchto číslic. Pokud jsou všechny číslice 0 , sekvence je neplatná.

Například odpovídá \101 cílové sekvenci při "a" použití kódování znaků ASCII.

Běžný znak

Běžný znak je jakýkoli platný znak, který nemá v aktuální gramatice zvláštní význam.

V ECMAScript systému mají následující znaky speciální význam:

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

V basic a mají následující grep znaky speciální význam:

  • . [ \

Také v a mají následující znaky při použití v konkrétním kontextu basicgrep speciální významy:

  • * má ve všech případech zvláštní význam, s výjimkou případů, kdy se jedná o první znak v regulárním výrazu nebo první znak, který následuje po počátečním znaku v regulárním výrazu, nebo pokud se jedná o první znak skupiny zachycení nebo první znak, který následuje po počátečním znaku ve skupině ^^ zachycení.

  • ^ má zvláštní význam, pokud se jedná o první znak regulárního výrazu.

  • $ má zvláštní význam, pokud se jedná o poslední znak regulárního výrazu.

V extended , e a mají následující grepawk znaky speciální význam:

  • . [ \ ( * + ? { |

V , e a mají následující znaky při použití v konkrétním kontextu extendedgrep speciální awk významy.

  • ) má zvláštní význam, pokud odpovídá předchozímu (

  • ^ má zvláštní význam, pokud se jedná o první znak regulárního výrazu.

  • $ má zvláštní význam, pokud se jedná o poslední znak regulárního výrazu.

Běžný znak odpovídá stejnému znaku v cílové sekvenci. Ve výchozím nastavení to znamená, že porovnání se zdaří, pokud jsou dva znaky zastoupeny stejnou hodnotou. Při porovnávání bez rozlišení velkých a malých písmen se dva znaky ch0ch1 shodují, pokud traits.translate_nocase(ch0) == traits.translate_nocase(ch1) . V případě shody citlivé na národní prostředí se dva znaky ch0ch1 shodují, pokud traits.translate(ch0) == traits.translate(ch1) .

Kladný kontrolní výraz

Kladný kontrolní výraz odpovídá svému obsahu, ale v cílové sekvenci nevyužívá žádné znaky.

Příklady:

  • (=aa)(a*) odpovídá cílové sekvenci "aaaa" a přidruží skupinu zachycení 1 k dílčí sekvenci "aaaa" .

  • (aa)(a*) odpovídá cílové sekvenci a přidruží skupinu zachycení 1 k dílčí sekvenci na začátku cílové sekvence a skupinu zachycení 2 k dílčí sekvenci na konci cílové "aaaa""aa""aa" sekvence.

  • (=aa)(a)|(a) odpovídá cílové sekvenci a přidruží skupinu zachycení 1 k prázdné sekvenci (protože kladný kontrolní výraz selhal) a skupinu zachycení 2 k "a" dílčí sekvenci "a" . Také odpovídá cílové sekvenci a přidruží skupinu zachycení 1 k dílčí sekvenci a skupině zachycení "aa""aa" 2 k prázdné sekvenci.

Řídicí sekvence Unicode

Řídicí sekvence Unicode je zpětné lomítko následované písmenem následované 'u' čtyřmi šestnáctkálními číslicemi ( 0-9a-fA-F ). Odpovídá znaku v cílové sekvenci, který má hodnotu určenou pomocí čtyř číslic. Například odpovídá \u0041 cílové sekvenci při "a" použití kódování znaků ASCII.

Zástupný znak

Zástupný znak odpovídá libovolnému znaku v cílovém výrazu, s výjimkou nového řádku.

Hranice slova

Hranice slova se vyskytuje v následujících situacích:

  • Aktuální znak je na začátku cílové sekvence a je jedním ze znaků slova. A-Za-z0-9_

  • Aktuální poloha znaku je za koncem cílové sekvence a poslední znak v cílové sekvenci je jedním ze znaků slova.

  • Aktuální znak je jedním ze znaků slova a předchozí znak není.

  • Aktuální znak není jedním ze znaků slova a předchozí znak je .

Kontrolní výraz hranice slova

Kontrolní výraz hranice slova se shoduje, když je aktuální pozice v cílovém řetězci bezprostředně za hranicí slova.

Porovnávání a vyhledávání

Aby regulární výraz odpovídal cílové sekvenci, musí celý regulární výraz odpovídat celé cílové sekvenci. Například regulární výraz odpovídá cílové sekvenci, ale neodpovídá cílové bcd"bcd" sekvenci "abcd" ani cílové sekvenci "bcde" .

Aby hledání regulárního výrazu bylo úspěšné, někde v cílové sekvenci se musí nacházet dílčí sekvence, která odpovídá regulárnímu výrazu. Hledání obvykle najde odpovídající dílčí sekvenci nejvíce vlevo.

Příklady:

  • Hledání regulárního výrazu v cílové sekvenci je úspěšné a bcd odpovídá celé "bcd" sekvenci. Stejné hledání v cílové sekvenci "abcd" je také úspěšné a odpovídá posledním třem znakům. Stejné hledání v cílové sekvenci "bcde" je také úspěšné a odpovídá prvním třem znakům.

  • Hledání regulárního výrazu v cílové sekvenci je úspěšné a bcd odpovídá prvním třem "bcdbcd" znakům.

Pokud existuje více dílčích sekvencí, které se shodují v některém umístění v cílové sekvenci, existují dva způsoby, jak zvolit odpovídající vzor.

První shoda zvolí dílčí sekvenci, která byla nalezena jako první při shodě regulárního výrazu.

Nejdelší shoda zvolí nejdelší dílčí sekvenci z těch, které odpovídají v tomto umístění. Pokud existuje více než jedna dílčí sekvence s maximální délkou, nejdelší shoda zvolí tu, která byla nalezena jako první.

Pokud se například použije první shoda, hledání regulárního výrazu v cílové sekvenci odpovídá dílčí sekvenci, protože levý termín alternace odpovídá tomuto dílčímu sekvenci. Proto první shoda nezkouší pravou pojem b|bc"abcd""b" alternace. Při použití nejdelší shody se shoduje stejné hledání, protože "bc""bc" je delší než "b" .

Částečná shoda je úspěšná, pokud shoda dosáhne konce cílové sekvence bez selhání, i když nedosáhne konce regulárního výrazu. Proto by po úspěchu částečné shody mohlo připojení znaků k cílové sekvenci způsobit pozdější selhání částečné shody. Pokud ale částečná shoda selže, připojení znaků k cílové sekvenci nemůže způsobit pozdější částečnou shodu. Například s částečnou shodou odpovídá ab cílové "a" sekvenci, ale nikoli "ac" .

Příznaky formátu

ECMAScript Pravidla formátu Pravidla formátu SED Náhradní text
$& & Sekvence znaků, která odpovídá celému regulárnímu výrazu: [match[0].first, match[0].second)
$$ $
\& &
$`" (znak dolaru následovaný uvozovkou) Sekvence znaků, která předchází dílčí sekvenci, která odpovídá regulárnímu výrazu: [match.prefix().first, match.prefix().second)
$'" (znak dolaru následovaný dopředné uvozovky) Sekvence znaků následující po dílčí sekvenci, která odpovídá regulárnímu výrazu: [match.suffix().first, match.suffix().second)
$n \n Sekvence znaků, která odpovídá skupině zachycení na pozici , kde je číslo mezi nn 0 a 9: [match[n].first, match[n].second)
\\n \n
$nn Sekvence znaků, která odpovídá skupině zachycení na pozici , kde je číslo mezi nnnn 10 a 99: [match[nn].first, match[nn].second)

Viz také

Přehled standardní knihovny C++