Jedná se o referenční stránku – nemějte pocit, že ji musíte číst, protože je poměrně stručná. Ostatní sekce na ni v případě potřeby odkazují.
Regexové modifikátory se na této stránce objevují na každém rohu. Než abych opakovaně vysvětloval, co dělají a kolik způsobů, jak je zapnout v každé příchuti regexu, rozhodl jsem se shromáždit čtyři běžné (i, s, m a x) na jednom místě. V závěrečné části je stručný přehled dalších modifikátorů, které jsou obvykle specifické pro daný jazyk.
Přeskakovací body
Pro snadnou orientaci zde najdete několik přeskakovacích bodů do různých částí stránky:
✽ Necitlivost na velikost písmen: i
✽ DOTALL (tečka odpovídá zlomům řádků): s (kromě Ruby a JavaScriptu)
✽ Víceřádkové (^ a $ odpovídají na každém řádku): (kromě Ruby)
✽ Free-Spacing: x (kromě JavaScriptu)
✽ Other Modifiers
✽ PCRE’s Special Start-of-Pattern Modifiers
(direct link)

Case Insensitivity: i

Ve výchozím nastavení všechny hlavní regex enginy porovnávají v režimu rozlišování velkých a malých písmen. Pokud chcete, aby vzory, jako je například Jméno: +, aby odpovídaly v režimu nerozlišování velkých a malých písmen, musíme tuto funkci zapnout.
Ano, ale…
Co vlastně znamená rozlišování velkých a malých písmen?
Pokud se držíte 26 písmen anglické abecedy, je definice velkých a malých písmen jednoduchá. Když se pustíte do typografických vychytávek nebo jiných jazyků a písem, není to vždy tak jednoduché. Zde je několik otázek, na které můžete narazit.
✽ Bude fl (jeden znak, tj. ligatura fl) odpovídat FL?
✽ Bude à (jeden znak) odpovídat À?
✽ Bude à (dva znaky, tj. písmeno a a větný přízvuk) odpovídat À? Zdá se, že všechny motory to řeší správně.
✽ Bude ß odpovídat ss? Zdá se, že to neumí žádný motor.
✽ Bude i odpovídat İ (turecké velké i) stejně jako I?
Tyto otázky jsou jen špičkou ledovce. I kdybych znal všechny odpovědi, nebylo by možné je všechny zahrnout do této části: pokud používáte konkrétní skript, budete muset prozkoumat, jak váš konkrétní engine zachází s porovnáváním velkých a malých písmen v tomto skriptu.
Více než jeden způsob
U několika motorů si všimněte, že existují dva způsoby zapnutí porovnávání velkých a malých písmen: jako inline modifikátor (?i) nebo jako volba v metodě nebo funkci regex.
Inline modifikátor (?i)
V jazycích .NET, PCRE (C, PHP, R…), Perl, Python, Java a Ruby (ale ne v JavaScriptu) můžete použít inline modifikátor (?i), například v (?i)cat. V části o inline modifikátorech najdete šťavnaté podrobnosti o třech dalších funkcích (v Pythonu nejsou k dispozici): zapnutí uprostřed řetězce, vypnutí pomocí (?-i) nebo použití pouze na obsah nezachycené skupiny pomocí (?i:foo)

.NET
Kromě inline modifikátoru (?i) mají jazyky .NET možnost IgnoreCase. Například v jazyce C# můžete použít:
var catRegex = new Regex("cat", RegexOptions.IgnoreCase);
Perl
Kromě inline modifikátoru (?i) umožňuje Perl přidat příznak i za uzavírací oddělovač vzoru. Můžete například použít:
if ($the_subject =~ m/cat/i) { … }
PCRE (C, PHP, R…)
Všimněte si, že chcete-li v PCRE použít porovnávání bez ohledu na velikost písmen s neanglickými písmeny, která nejsou součástí vašeho locale, musíte zapnout režim Unicode – například pomocí speciálního modifikátoru začátku vzoru (*UTF8).
Kromě (?i) inline modifikátoru umožňuje PCRE nastavit režim PCRE_CASELESS při volání funkce pcre_compile() (nebo podobné funkce):

cat_regex = pcre_compile( "cat", PCRE_CASELESS, &error, &erroroffset, NULL ); 

V PHP se volba PCRE_CASELESS předává prostřednictvím příznaku i, který můžete přidat do regexového řetězce za uzavírací oddělovač. Můžete například použít:
$cat_regex = '~cat~i';
V jazyce R se volba PCRE_CASELESS předává prostřednictvím příznaku ignore.case=TRUE. V jazyce Python můžete například použít:
grep("cat", subject, perl=TRUE, value=TRUE, ignore.case=TRUE);
Python
Kromě modifikátoru (?i) inline má Python volbu IGNORECASE. Můžete například použít:
cat_regex = re.compile("cat", re.IGNORECASE)
Java
Kromě inline modifikátoru (?i) má Java volbu CASE_INSENSITIVE. Můžete například použít:

Pattern catRegex = Pattern.compile( "cat", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE );

Přidaná volba UNICODE_CASE zajišťuje, že funkce citlivosti na malá a velká písmena je kompatibilní s Unicode. Pokud pracujete pouze s ASCII, nemusíte ji používat.
JavaScript
V jazyce JavaScript je jedinou možností přidat příznak i za uzavírací oddělovač vzoru. Můžete například použít:
var catRegex = /cat/i;
Ruby
Kromě inline modifikátoru (?i) umožňuje Ruby přidat příznak i za uzavírací oddělovač vzoru. Můžete například použít:
cat_regex = /cat/i
(přímý odkaz)

DOTALL (tečka odpovídá zalomení řádku): s (s výjimkami)

Ve výchozím nastavení tečka . neodpovídá znakům zalomení řádku, jako je posuv řádku a návrat vozíku. Pokud chcete použít vzory jako BEGIN .*? END, aby odpovídaly napříč řádky, musíme tuto funkci zapnout.
Tento režim se někdy nazývá jednořádkový (proto s), protože pokud jde o tečku, mění celý řetězec v jeden velký řádek – .* bude odpovídat od prvního znaku po poslední, bez ohledu na to, kolik zlomů řádků stojí mezi nimi.
Tento režim se v jazycích PCRE, Python a Java nazývá také DOTALL (přesněji řečeno, v dokumentaci PCRE se používá PCRE_DOTALL). Podle mě je název DOTALL rozumným způsobem, jak tento režim nazývat. Třetí možnost dot-matches-line-breaks je sice popisná, ale poněkud krkolomná.

U několika enginů si všimněte, že ji lze zapnout dvěma způsoby: jako inline modifikátor nebo jako volbu v metodě nebo funkci regex.
JavaScript
JavaScript jednořádkový režim nepodporuje. Chcete-li v jazyce JavaScript porovnat libovolný znak, včetně zlomů řádků, použijte konstrukci, například . Tato třída znaků odpovídá jednomu znaku, který není číslicí \D nebo číslicí \d. Odpovídá tedy jakémukoli znaku.
Dalším řešením v jazyce JavaScript je použití regexové knihovny XRegExp. Pokud máte nekonečně mnoho času, můžete také zkusit přenést PCRE do JavaScriptu pomocí Emscriptenu, jak to zřejmě udělal Firas na regex 101.
Inline modifikátor (?s)
V .NET, PCRE (C, PHP, R…), Perlu, Pythonu a Javě (ale ne v Ruby) můžete použít inline modifikátor (?s), například v (?s)BEGIN .*? END. V části o inline modifikátorech najdete šťavnaté podrobnosti o třech dalších funkcích (v Pythonu nejsou k dispozici): zapnutí uprostřed řetězce, vypnutí pomocí (?-s) nebo použití pouze na obsah nezachycené skupiny pomocí (?s:foo)
.NET
Kromě inline modifikátoru (?s) mají jazyky .NET možnost Singleline. Například v jazyce C# můžete použít:

var blockRegex = new Regex( "BEGIN .*? END", RegexOptions.IgnoreCase | RegexOptions.Singleline );

Perl
Kromě modifikátoru (?s) inline umožňuje Perl přidat příznak s za uzavírací oddělovač vzoru. Můžete například použít:
if ($the_subject =~ m/BEGIN .*? END/s) { … }
PCRE (C, PHP, R…)
Kromě modifikátoru (?s) inline umožňuje PCRE nastavit režim PCRE_DOTALL při volání funkce pcre_compile() (nebo podobné funkce):

block_regex = pcre_compile( "BEGIN .*? END", PCRE_DOTALL, &error, &erroroffset, NULL ); 

V PHP se volba PCRE_DOTALL předává prostřednictvím příznaku s, který můžete přidat do svého regexového řetězce za uzavírací oddělovač. Můžete například použít:
$block_regex = '~BEGIN .*? END~s';
Python
Kromě modifikátoru (?s) inline má Python možnost DOTALL. Můžete například použít:
block_regex = re.compile("BEGIN .*? END", re.IGNORECASE | re.DOTALL)
Java
Kromě modifikátoru (?s) inline má Java možnost DOTALL. Můžete například použít:

Pattern blockRegex = Pattern.compile( "BEGIN .*? END", Pattern.CASE_INSENSITIVE | Pattern.DOTALL ); 

Ruby: V jazyce Ruby můžete použít modifikátor (?m) a příznak m
V jazyce Ruby můžete použít inline modifikátor (?m), například v příkazu (?m)BEGIN .*? END. To je zvláštní zvláštnost Ruby, protože jiné enginy používají (?m) pro režim „^ a $ odpovídají na každém řádku“.
V sekci o inline modifikátorech najdete šťavnaté podrobnosti o třech dalších funkcích: zapnutí uprostřed řetězce, vypnutí pomocí (?-m) nebo použití pouze na obsah nezachycené skupiny pomocí (?m:foo)

Ruby také umožňuje přidat příznak m na konec regexového řetězce. Můžete například použít:
block_regex = /BEGIN .*? END/m
(přímý odkaz)
Původ DOTALL
Jednořádkový režim se také často nazývá DOTALL (což je zkratka pro „dot matches all“) díky volbě PCRE_DOTALL v PCRE, volbě re.DOTALL v Pythonu a volbě Pattern.DOTALL v Javě.
Několikrát jsem slyšel tvrzení, že „DOTALL je věc Pythonu“, ale zdálo se, že to pochází od lidí, kteří neslyšeli o ekvivalentních volbách v PCRE a Javě. Přesto mě to přimělo k zamyšlení: kde se DOTALL objevil poprvé? Při pohledu do Change Logu PCRE a staré dokumentace Pythonu se zdá, že se v PCRE objevil s verzí 0.96 (říjen 1997), v Pythonu s verzí 1.5 (únor 1998) a poté v Javě 1.4 (únor 2002). Rozdíl mezi uvedením PCRE a Pythonu nebyl průkazný – slovo mohlo být v oběhu v dřívějších beta verzích nebo dokonce v jiných nástrojích – a tak jsem se na to zeptal Philipa Hazela (otce PCRE). Odpověděl mi:

Myslím, že jsem ho vymyslel já – rozhodně jsem ho nikde jinde neviděl, když jsem se snažil vymyslet název pro volbu PCRE, který by odpovídal volbě /s v Perlu. („S“ tam znamená „jednořádkový“ (…), takže jsem chtěl lepší název.)

Takže tak. Kdo má rád trochu historie, toho možná potěší tato chutná perlička.
(přímý odkaz)

Víceřádkové (^ a $ odpovídají na každém řádku): m (kromě Ruby)

Ve výchozím nastavení ve všech hlavních enginech kromě Ruby odpovídají kotvy ^ a $ (v tomto pořadí) pouze na začátku a na konci řetězce.
V Ruby odpovídají na začátku a na konci každého řádku a neexistuje způsob, jak tuto funkci vypnout. To je vlastně rozumný způsob, kterým se Ruby částečně vykupuje za to, že používá m pro režim DOTALL, když jiné enginy používají s.
V jiných enginech, pokud chceme, aby vzory jako ^Define a >>>$ odpovídaly (v tomto pořadí) na začátku a na konci každého řádku, musíme tuto vlastnost zapnout.
Tato funkce se obvykle nazývá víceřádková (proto m), protože kotvy ^ a $ pracují na více řádcích.
U několika enginů si všimněte, že existují dva způsoby, jak ji zapnout: jako inline modifikátor (?m) nebo jako volba v metodě nebo funkci regex.
Ruby
V Ruby kotvy ^ a $ vždy odpovídají na všech řádcích. Tuto volbu nelze vypnout. Je to vlastně docela příjemný způsob, protože stejně jako ve většině příchutí existují samostatné kotvy pro začátek a konec řetězců:
Na druhou stranu lze litovat, že se Ruby rozhodlo používat příznak m a modifikátor nestandardním způsobem (viz DOTALL).
Inline modifikátor (?m)
V .NET, PCRE (C, PHP, R…), Perlu, Pythonu, Javě a Ruby (ale ne v JavaScriptu) lze použít inline modifikátor (?m), například v (?m)^cat. V části o inline modifikátorech najdete šťavnaté podrobnosti o třech dalších funkcích (v Pythonu nejsou k dispozici): zapnutí uprostřed řetězce, vypnutí pomocí (?-m) nebo použití pouze na obsah nezachycené skupiny pomocí (?m:foo)

.NET
Kromě inline modifikátoru (?m) mají jazyky .NET možnost Multiline. Například v jazyce C# můžete použít:

var catRegex = new Regex("^cat", RegexOptions.IgnoreCase | RegexOptions.Multiline); 

Perl
Kromě modifikátoru (?m) inline umožňuje Perl přidat příznak m za uzavírací oddělovač vzoru. Můžete například použít:
if ($the_subject =~ m/^cat/m) { … }
PCRE (C, PHP, R…)
Kromě modifikátoru (?m) inline umožňuje PCRE nastavit režim PCRE_MULTILINE při volání funkce pcre_compile() (nebo podobné funkce):

cat_regex = pcre_compile( "^cat", PCRE_CASELESS | PCRE_MULTILINE, &error, &erroroffset, NULL ); 

V PHP se volba PCRE_MULTILINE předává pomocí příznaku m, který můžete přidat do svého regexového řetězce za uzavírací oddělovač. Můžete například použít:
$cat_regex = '~^cat~m';
Python
Kromě modifikátoru (?m) inline má Python možnost MULTILINE. Můžete například použít:
cat_regex = re.compile("^cat", re.IGNORECASE | re.MULTILINE)
Java
Kromě modifikátoru (?m) inline má Java možnost MULTILINE. Můžete například použít:

Pattern catRegex = Pattern.compile( "^cat", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE ); 

JavaScript
V jazyce JavaScript je jedinou možností přidat příznak m za uzavírací oddělovač vzoru. Můžete například použít:
var catRegex = /^cat/m;
(přímý odkaz)

Volná mezera: x (kromě JavaScriptu)

Ve výchozím nastavení určuje jakákoli mezera v regexovém řetězci znak, který má být porovnán. V jazycích, kde lze regexové řetězce zapisovat na více řádků, určují zalomení řádků také doslovné znaky, které mají být porovnány. Protože nemůžete vkládat mezery pro oddělení skupin, které nesou různé významy (jako to děláte mezi frázemi a pragrafy při psaní v angličtině), může se stát, že regex bude špatně čitelný, jako například regex Meaning of Life ze stránky regex humor:
^(?=(?!(.))()(?-1)(?<!\d(?<=(?!)\d))).$
Naštěstí mnoho motorů podporuje režim volných mezer, který umožňuje regex provzdušnit. Můžete například přidávat mezery mezi tokeny. V PHP byste mohli napsat toto – všimněte si příznaku x za konečným oddělovačem ~:
$word_with_digit_and_cap_regex = '~ ^ (?=\D*\d) \w*\w* $ ~x';
Ale proč zůstávat na jednom řádku? Svůj regex můžete rozprostřít na libovolný počet řádků – odřádkovat a přidávat komentáře -, které jsou uvozeny znakem #. Například v jazyce C# můžete udělat něco takového:

var wordWithDigitAndCapRegex = new Regex(@"(?x) # Free-spacing mode ^ # Assert that position = beginning of string ######### Lookahead ########## (?= # Start lookahead \D* # Match any non-digits \d # Match one digit ) # End lookahead ######## Matching Section ######## \w* # Match any word chars # Match one upper-case letter \w* # Match any word chars $ # Assert that position = end of string");

Tento režim se nazývá režim volného řádkování. Můžete se setkat také s názvem režim bílých znaků, režim komentářů nebo slovní režim.
V jednoduchém regexu, jako je ten výše uvedený, to může být přehnané (i když každý, kdo musí váš kód spravovat, vám za to poděkuje). Ale pokud vytváříte seriózní regexový vzor, jako je ten v triku, který má odpovídat číslům v prosté angličtině… Pokud nejste masochista, nemáte na výběr.
Všimněte si, že uvnitř třídy znaků jsou znak mezery a znak # (který jinak zavádí komentáře) stále ctěny – s výjimkou Javy, kde je třeba oba escapovat, pokud chcete tyto znaky porovnávat.
U několika enginů existují dva způsoby, jak zapnout režim volných mezer: jako inline modifikátor nebo jako volba v metodě nebo funkci regexu.
Režim volných mezer je úžasný, ale existuje několik drobných nebezpečí, kterých byste si měli být vědomi, protože vás mohou nechat drbat se na hlavě a přemýšlet, proč vzor nefunguje tak, jak jste očekávali.
Nebezpečí č. 1: Význam mezery
První je, že už nemůžete používat Číslo: \d+ k přiřazení řetězce, jako je například Číslo: 24. Důvodem je to, že mezera v : \d již neodpovídá mezeře. Jsme v režimu volných mezer, pamatujete? O to přece jde.
Chcete-li přiřadit znak mezery, musíte jej zadat. Dva hlavní způsoby, jak to udělat, jsou umístit ji uvnitř třídy znaků nebo ji vypustit pomocí zpětného lomítka. Oba tyto způsoby budou fungovat: Číslo:\d+ nebo Číslo:\ \d+
Shoduje se samozřejmě i Číslo:\s\d+, ale nezapomeňte, že \s odpovídá mnohem více než znaku mezery. Může například odpovídat tabulátoru nebo zalomení řádku. To nemusí být to, co chcete.
Nebezpečí výletu č. 2: Pozdní začátek
Druhé, můžete si být příliš jisti silou volných mezer a zkusit něco takového, aby regex stál sám o sobě:

var wordWithDigitAndCapRegex = new Regex(@" (?x) # Free-spacing mode ^ # Beginning of string etc # Match the literal chars e,t,c");

Problém je v tom, že i když to může vypadat, že modifikátor volných mezer (?x) je první věcí ve vašem regexu, není tomu tak.
Po úvodní dvojtečce “ máme zalomení řádku a řadu mezer. Motor se jim snaží přizpůsobit, protože v této fázi ještě nejsme v režimu volných mezer. Tento režim se zapne, až když narazíme na (?x). Tento regex nikdy nebude odpovídat řetězci atd. a dalším, protože v okamžiku, kdy narazíme na začátek řetězce s kotvou ^, se předpokládá, že již odpovídáme znaku zalomení řádku a mezery!“
Proto když se podíváte na první příklad, uvidíte, že modifikátor volných mezer (?x) je úplně první věc po úvodním znaku uvozovky.

Bílé znaky nejsou ze vzoru pouze ořezány
I když jsou bílé znaky ignorovány, pozice bílého znaku stále odděluje předchozí znak od následujícího. Například
✽ (A)\1 2 není totéž co (A)\12. První odpovídá AA2, druhé odpovídá A\n v .NET, PCRE, Perlu a Ruby (12 je osmičkový kód pro znak konce řádku)
✽ \p{Nd} je platné, ale \p{N d} ne – s výjimkou Perlu a Ruby
JavaScript
JavaScript nepodporuje režim volných mezer. Chcete-li v jazyce JavaScript přiřadit libovolný znak včetně zalomení řádku, použijte konstrukci jako . Tato třída znaků odpovídá jednomu znaku, který není číslicí \D nebo číslicí \d. Odpovídá tedy jakémukoli znaku.
Dalším řešením v jazyce JavaScript je použití regexové knihovny XRegExp. Pokud máte nekonečně mnoho času, můžete také zkusit přenést PCRE do JavaScriptu pomocí Emscriptenu, jak to zřejmě udělal Firas na regex 101.
Inline modifikátor (?s)
V .NET, PCRE (C, PHP, R…), Perlu, Pythonu, Javě a Ruby (ale ne v JavaScriptu) můžete použít inline modifikátor (?).x), například se jedná o provzdušněný regex pro porovnávání opakujících se slov:
(?x) (\w+) + \bTaké viz část o inline modifikátorech.
.NET
Kromě inline modifikátoru (?x) mají jazyky .NET možnost IgnorePatternWhitespace. Například v jazyce C# můžete použít:

var repeatedWordRegex = new Regex(@" (\w+) + \b", RegexOptions.IgnorePatternWhitespace );

Perl
Kromě modifikátoru (?x) inline umožňuje Perl přidat příznak x za uzavírací oddělovač vzoru. Můžete například použít:
if ($the_subject =~ m/(\w+) + \b/x) { … }
PCRE (C, PHP, R…)
Kromě modifikátoru (?x) inline umožňuje PCRE nastavit režim PCRE_EXTENDED při volání funkce pcre_compile() (nebo podobné):

repeated_word_regex = pcre_compile( "(\w+) + \b", PCRE_EXTENDED, &error, &erroroffset, NULL ); 

V PHP se volba PCRE_EXTENDED předává pomocí příznaku x, který můžete přidat do svého regexového řetězce za uzavírací oddělovač. Můžete například použít:
$repeated_word_regex = '~(\w+) + \b~x';
Python
Kromě modifikátoru (?x) inline má Python možnost VERBOSE. Můžete například použít:
repeated_word_regex = re.compile(r"(\w+) + \b", re.VERBOSE)
Java
Na rozdíl od jiných enginů jsou uvnitř tříd znaků Javy hashe zavádějící komentáře a mezery ignorovány, takže pokud chcete tyto znaky ve třídě použít, musíte je escapovat, například +
Kromě modifikátoru (?x) inline má Java možnost COMMENTS. Můžete například použít:

Pattern repeatedWordRegex = Pattern.compile( "(\w+) + \1\b", Pattern.COMMENTS );

Ruby
Kromě (?x) inline modifikátoru umožňuje Ruby přidat příznak x na konec regexového řetězce. Můžete například použít:

repeated_word_regex = /(\w+) + \b/x
(přímý odkaz)

Další modifikátory

Některé enginy podporují kromě i, s, m a x i další modifikátory a příznaky. Těmi se plánuji zabývat na stránkách věnovaných těmto variantám.
Například
✽ .NET má modifikátor (?n) (přístupný také prostřednictvím volby ExplicitCapture). Ten změní všechny (závorky) na skupiny bez zachycení. Chcete-li zachytit, musíte použít pojmenované skupiny.
✽ Java má modifikátor (?d) (přístupný také prostřednictvím volby UNIX_LINES). Je-li tato funkce zapnuta, znak posuvu řádku \n je jediný, který ovlivňuje tečku . (který neodpovídá zlomům řádků, pokud není zapnuta funkce DOTALL) a kotvy ^ a $ (které odpovídají začátkům a koncům řádků ve víceřádkovém režimu.)
✽ Perl má několik dalších příznaků. Viz část dokumentace o modifikátorech.
✽ PCRE má modifikátor (?J) (dostupný také v kódu prostřednictvím volby PCRE_DUPNAMES). Je-li nastaven, mohou různé skupiny zachycení používat stejné jméno – ačkoli jim budou přiřazena různá čísla.
(přímý odkaz)
✽ PCRE má modifikátor (?U) (dostupný také v kódu prostřednictvím volby PCRE_UNGREEDY). Je-li nastaven, jsou kvantifikátory ve výchozím nastavení ungreedy. Přidáním znaku ? se stanou chamtivými.
(přímý odkaz)
✽ PCRE má modifikátor (?X) (v kódu dostupný také prostřednictvím volby PCRE_EXTRA). Historicky se tento režim používal k povolení nových funkcí při vývoji. V současné době vyvolává chyby, pokud jsou tokeny jako \B použity ve třídě znaků (kde normálně odpovídá velkému písmenu B, na rozdíl od situace mimo třídu znaků, kde se jedná o tvrzení ne-hranici slova).
✽ PCRE má řadu speciálních modifikátorů, které lze nastavit na začátku vzoru (jsou uvedeny níže). Kromě toho lze mnoho voleb poslat rodině funkcí pcre_compile(), pokud k nim máte přístup. Podrobnosti o nich získáte, když si stáhnete soubor pcre_compile.html ze složky doc.
(přímý odkaz)

Speciální modifikátory začátku vzoru v PCRE

PCRE má řadu „speciálních modifikátorů“, které můžete nastavit na začátku vzoru. Místo standardní syntaxe (?z) pro řádkové modifikátory vypadá syntaxe speciálních modifikátorů takto: (*MYMODIFIER). Tyto modifikátory jsou užitečné zejména v kontextech, kdy je PCRE integrováno do nástroje nebo jazyka – protože nahrazují řadu možností, které byste poslali do funkce pcre_compile().
Řetězce UTF
Předpokládáme-li, že PCRE je zkompilováno s příslušnými volbami, můžete motoru nařídit, aby s řetězcem předmětu zacházel jako s různými druhy řetězců UTF.
✽ (*UTF) je obecný způsob, jak zacházet s předmětem jako s řetězcem UTF – zjišťuje, zda má být zpracován jako UTF-8, UTF-16 nebo UTF-32.

✽ (*UTF) je obecný způsob, jak zacházet s předmětem jako s řetězcem UTF.
✽ (*UTF8), (*UTF16) a (*UTF32) zpracovávají řetězec jako jedno ze tří konkrétních kódování UTF.
Vlastnosti Unicode pro \d a \w
Ve výchozím nastavení \d odpovídá pouze číslicím ASCII, zatímco \w odpovídá pouze číslicím ASCII, písmenům a podtržítkům.
Modifikátor (*UCP) (což je zkratka pro Unicode Character Properties) umožňuje, aby tyto tokeny odpovídaly číslicím Unicode a slovním znakům.
Například (*UCP)\d+ :: \w+ odpovídá 1۳۲١८৮੪ :: Aれま래도ᚠᚱᚩ
(viz ukázka).
V kombinaci s (*UCP) může být také nutné použít jeden z modifikátorů (*UTF). Abyste viděli, jak to funguje, vezměte v úvahu výstup tohoto programu se standardním PHP Xampp:

$string = '1۳۲١८৮੪ :: Aれま래도ᚠᚱᚩ';$utfregex = "~\d+ :: \w+~";$utfregex = "~(*UCP)\d+ :: \w+~";$utfregex = "~(*UTF)(*UCP)\d+ :: \w+~";$utfregex = "~(*UTF)\d+ :: \w+~";$utfregex = "~\d+ :: \w+~u";foreach (range(0, 4) as $i) { echo "$i: ".preg_match($utfregex,$string)."<br />"; }// Output:// 0: 0// 1: 0// 2: 1 => (*UTF)(*UCP)// 3: 0// 4: 1 => The u flag produces the same result as (*UTF)(*UCP)

Modifikátory přerušení řádku
Ve výchozím nastavení při kompilaci PCRE mu řeknete, co má považovat za přerušení řádku, když narazí na znak . (jako tečka neodpovídá přerušení řádku, pokud není v režimu dotall), stejně jako chování kotev ^ a $ v režimu více řádků. Toto výchozí nastavení můžete přepsat pomocí následujících modifikátorů:✽ (*LF) Za zalomení řádku se považuje pouze řádkový posuv (jako v Unixu)
✽ (*CRLF) Za zalomení řádku se považuje pouze návrat vozíku následovaný řádkovým posuvem. je považován za přerušení řádku (jako v systému Windows)
✽ (*ANYCRLF) Za přerušení řádku je považována jakákoli z výše uvedených tří sekvencí
✽ (*ANY) Za přerušení řádku je považována jakákoli sekvence nového řádku Unicode
Např, (*CR)\w+.\w+ odpovídá řádku1\nLine2, protože tečka může odpovídat \n, který není považován za zalomení řádku. Viz ukázka.
Ovládání \R
Ve výchozím nastavení odpovídá metaznak \R libovolné sekvenci nového řádku Unicode. Při vypnutém režimu UTF-8 jsou těmito sekvencemi nového řádku dvojice \r\n, stejně jako znaky carriage return, line feed, vertikální tabulátor, form feed nebo další řádek. V režimu UTF-8 se token shoduje také se znakem oddělovače řádků a oddělovače odstavců.
Dva modifikátory začátku vzoru umožňují změnit chování \R:
✽ Pomocí (*BSR_ANYCRLF) se \R shoduje pouze se sekvencí \r\n, \r nebo \n. To lze také nastavit při kompilaci PCRE nebo vyžádat pomocí volby PCRE_BSR_ANYCRLF
✽ S (*BSR_UNICODE) odpovídá \R libovolné sekvenci nového řádku Unicode (nadřazené volbě PCRE_BSR_ANYCRLF, je-li nastavena). Tuto hodnotu lze nastavit také při kompilaci PCRE nebo ji vyžádat pomocí volby PCRE_BSR_UNICODE
Kontrola zaběhnutých vzorů
Chcete-li omezit počet volání funkce match() v PCRE, použijte modifikátor (*LIMIT_MATCH=x) a nastavte x na požadovaný počet.
Chcete-li omezit rekurzi, použijte modifikátor (*LIMIT_RECURSION=d) a nastavte d na nejhlubší povolenou úroveň rekurze.
Vypnutí optimalizací
(přímý odkaz)
Ve výchozím nastavení PCRE studuje vzor a automaticky udělá z kvantifikovaného tokenu atomický, pokud je následující token nekompatibilní – například změní A+X na A++X. Modifikátor (*NO_AUTO_POSSESS) tuto optimalizaci vypíná. Použijte ji, když chcete použít pcretest k porovnání dvou vzorů a udělat si dobrý pocit ze všech cyklů, které vám automatické odsazování ušetří.
Ve výchozím nastavení provádí PCRE několik optimalizací, aby rychleji zjistilo, zda shoda selže. Modifikátor (*NO_START_OPT) tyto optimalizace vypíná.
Zakázání prázdných shod
V PCRE2 modifikátor (*NOTEMPTY) říká, aby engine nevracel prázdné shody. Podobně modifikátor (*NOTEMPTY_ATSTART) říká enginu, aby nevracel prázdné shody nalezené na začátku subjektu.
Zakázání optimalizace automatického ukotvení
Modifikátor PCRE2_NO_DOTSTAR_ANCHOR říká enginu, aby automaticky neukotvoval vzory začínající na .*
Další informace o tomto příznaku si můžete přečíst na stránce rozhraní PCRE2 API (hledejte PCRE2_NO_DOTSTAR_ANCHOR).

Nepřehlédněte Průvodce stylem regexu
a Nejlepší regexový trik všech dob!!!


1001 způsobů použití regexu
.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.