Tämä on viitesivu – älä koe, että sinun on pakko lukea sitä, sillä se on melko suppea. Muut osiot viittaavat siihen tarvittaessa.
Regex-modifikaattorit ilmaantuvat tällä sivustolla joka nurkalla. Sen sijaan, että selittäisin toistuvasti, mitä ne tekevät ja kuinka monta tapaa ottaa ne käyttöön jokaisessa regex-muunnoksessa, päätin koota neljä yleisintä (i, s, m ja x) yhteen paikkaan. Viimeisessä osiossa tarkastellaan lyhyesti muita modifikaattoreita, jotka ovat yleensä kielikohtaisia.
Hyppypisteet
Helppoa navigointia varten tässä on muutamia hyppypisteitä sivun eri osioihin:
✽ Case Insensitivity: i
✽ DOTALL (Dot Matches Line Breaks): s (paitsi Ruby ja JavaScript)
✽ Multiline (^ ja $ Match on Every Line):
✽ Free-Spacing: x (paitsi JavaScript)
✽ Other Modifiers
✽ PCRE’s Special Start-of-Pattern Modifiers
(suora linkki)

Case Insensitivity: i

Vakiossa kaikki tärkeimmät regex-moottorit täsmäävät isojen ja keskisuurten kirjainten välillä. Jos haluat kuvioita, kuten Nimi: + täsmäävät isojen ja pienten kirjainten suhteen, meidän on otettava tämä ominaisuus käyttöön.
Kyllä, mutta…
Mitä isojen ja pienten kirjainten sensitiivisyys oikeastaan tarkoittaa?
Sikäli kuin pitäydyt englannin aakkosten 26 kirjaimessa, isojen ja pienten kirjainten määrittely on suoraviivaista. Kun siirrytään typografisiin hienouksiin tai muihin kieliin ja kirjoitusasuihin, asiat eivät ole aina niin yksinkertaisia. Seuraavassa on muutamia kysymyksiä, joihin saatat törmätä.
✽ Sopiiko fl (yksi merkki, eli fl-ligatuuri) yhteen FL:n kanssa?
✽ Sopiiko à (yksi merkki) yhteen À:n kanssa?
✽ Sopiiko à (kaksi merkkiä, eli a-kirjain ja painollinen aksentti) yhteen À:n kanssa? Kaikki moottorit näyttävät käsittelevän sitä oikein.
✽ Sopiiko ß yhteen ss:n kanssa? Mikään moottori ei näytä tekevän niin.
✽ Vastaako i İ:tä (turkkilaista isoa i:tä) samoin kuin I:tä?
Nämä kysymykset ovat vain jäävuoren huippu. Vaikka tietäisin kaikki vastaukset, olisi mahdotonta sisällyttää niitä kaikkia tähän osioon: jos käytät tiettyä komentosarjaa, sinun on tutkittava, miten juuri sinun moottorisi käsittelee isojen ja pienten kirjainten erittelemätöntä täsmäytystä kyseisessä komentosarjassa.
Montaa tapaa
Useiden moottoreiden osalta on huomattava, että isojen ja pienten kirjainten erittelemättömän täsmäytyksen kytkeminen päälle voidaan tehdä kahdella eri tavalla: rivin sisällä olevana modifiointimerkkinä (?i) tai valintana regex-metodissa tai -funktiossa.
Inline-modifioija (?i)
.NET:ssä, PCRE:ssä (C, PHP, R…), Perlissä, Pythonissa, Javassa ja Rubyssa (mutta ei JavaScriptissä) voit käyttää inline-modifikaattoria (?i), esimerkiksi kohdassa (?i)cat. Katso inline-modifioijia käsittelevästä osiosta mehukkaita yksityiskohtia kolmesta lisäominaisuudesta (joita ei ole saatavilla Pythonissa): sen kytkeminen päälle kesken merkkijonon, sen kytkeminen pois päältä komennolla (?-i) tai sen käyttäminen vain muiden kuin sieppausryhmien sisältöön komennolla (?i:foo)

.NET
Inline-modifikaattorin (?i) lisäksi .NET-kielissä on IgnoreCase-vaihtoehto. Esimerkiksi C#-kielessä voit käyttää:
var catRegex = new Regex("cat", RegexOptions.IgnoreCase);
Perl
Perl
Lisäksi (?i) inline-modifiointiainetta Perlissä voit lisätä i-lippukkeen kuvion sulkevan erottimen jälkeen. Voit esimerkiksi käyttää:
if ($the_subject =~ m/cat/i) { … }
PCRE (C, PHP, R…)
Huomaa, että jos haluat PCRE:ssä käyttää isoja ja pieniä kirjaimia erittelemätöntä täsmäytystä muiden kuin englanninkielisten kirjainten kanssa, jotka eivät kuulu paikalliseen alueeseesi, sinun on otettava käyttöön Unicode-tila – esimerkiksi (*UTF8)-erikoismodifikaattorilla kuvion alussa.
Lisäksi (?i) inline-modifikaattorin lisäksi PCRE:ssä voit asettaa PCRE_CASELESS-tilan kutsuttaessa pcre_compile()- (tai vastaavaa) funktiota:

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

Php:ssä PCRE_CASELESS-vaihtoehto välitetään i-lipukkeella, jonka voit lisätä regex-merkkijonoon sulkevan erottimen jälkeen. Voit esimerkiksi käyttää esim:
$cat_regex = '~cat~i';
R:ssä PCRE_CASELESS-vaihtoehto välitetään ignore.case=TRUE-vaihtoehdon kautta. Voit käyttää esimerkiksi:
grep("cat", subject, perl=TRUE, value=TRUE, ignore.case=TRUE);
Python
Pythonissa (?i) inline-modifioijan lisäksi Pythonissa on IGNORECASE-optio. Voit esimerkiksi käyttää:
cat_regex = re.compile("cat", re.IGNORECASE)
Java
Javassa on (?i) inline-modifioijan lisäksi CASE_INSENSITIVE-vaihtoehto. Voit esimerkiksi käyttää:

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

Tässä lisätty UNICODE_CASE-vaihtoehto varmistaa, että isojen ja pienten kirjainten tuntemattomuusominaisuus on Unicode-tietoinen. Jos työskentelet vain ASCII:n kanssa, sinun ei tarvitse käyttää sitä.
JavaScript
JavaScriptissa ainoa vaihtoehtosi on lisätä i-lippu kuvion sulkevan erottimen jälkeen. Voit esimerkiksi käyttää:
var catRegex = /cat/i;
Ruby
Ruby
Rubyssä voit lisätä i-lippukkeen kuvion sulkevan erottimen jälkeen (?i) inline-modifikaattorin lisäksi. Voit käyttää esimerkiksi:
cat_regex = /cat/i
(suora linkki)

DOTALL (piste sopii rivinvaihtomerkkeihin): s (poikkeuksia lukuun ottamatta)

Piste . ei oletusarvoisesti sovi rivinvaihtomerkkeihin, kuten rivinvaihtomerkkeihin ja rivinvaihtoon. Jos haluat kuvioita, kuten BEGIN .*? END täsmäävät rivien yli, meidän on kytkettävä tämä ominaisuus päälle.
Tätä tilaa kutsutaan joskus yksiriviseksi (siksi s), koska pisteen osalta se muuttaa koko merkkijonon yhdeksi isoksi riviksi -.* täsmää ensimmäisestä merkistä viimeiseen merkkiin riippumatta siitä, kuinka monta rivinvaihtoa välissä on.

Tilaa kutsutaan myös nimellä DOTALL PCRE:ssä, Pythonissa ja Javassa (tarkemmin sanottuna PCRE-dokumentaatiossa käytetään PCRE_DOTALL). Minusta nimi DOTALL on järkevä tapa kutsua tätä tilaa. Kolmas vaihtoehto dot-matches-line-breaks on kuvaava, mutta hieman suunpieksentäyteinen.
Huomaa useiden moottoreiden kohdalla, että se voidaan ottaa käyttöön kahdella tavalla: rivin sisäisenä muokkaajana tai regex-metodin tai -funktion valintana.
JavaScript
JavaScript ei tue yhden rivin tilaa. Jos haluat sovittaa minkä tahansa merkin JavaScriptissä, myös rivinvaihdon, käytä konstruktiota, kuten . Tämä merkkiluokka vastaa yhtä merkkiä, joka on joko muu kuin numero \D tai numero \d. Se sopii siis mihin tahansa merkkiin.
Toinen JavaScript-ratkaisu on käyttää XRegExp-regex-kirjastoa. Jos sinulla on loputtomasti aikaa, voit myös yrittää portata PCRE:n JavaScriptiin Emscriptenin avulla, kuten Firas näyttää tehneen regex 101:ssä.
Inline-modifioija (?s)
.NET:ssä, PCRE:ssä (C:ssä, PHP:ssä, R:ssä…), Perl:ssä, Python:ssä ja Java:ssa (mutta ei Ruby:ssä) voit käyttää inline-modifikaattoria (?s) vaikkapa seuraavassa muodossa: (?s)ALKUSANANAT .*? END. Katso inline-modifikaattoreita käsittelevästä osiosta mehukkaita yksityiskohtia kolmesta lisäominaisuudesta (joita ei ole saatavilla Pythonissa): sen kytkeminen päälle kesken merkkijonon, sen kytkeminen pois päältä komennolla (?-s) tai sen soveltaminen vain ei-kiinnitysryhmän sisältöön komennolla (?s:foo)
.NET
Lisäksi inline-modifikaattorista (?s) .NET-kielissä on Singleline-vaihtoehto. Esimerkiksi C#-kielessä voit käyttää:

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

Perl
Perl
Lisäksi (?s) inline-modifiointiainetta Perlissä voit lisätä s-lipukkeen kuvion sulkevan erottimen jälkeen. Voit esimerkiksi käyttää esim:
if ($the_subject =~ m/BEGIN .*? END/s) { … }
PCRE (C, PHP, R…)
PcRE:n avulla voit (?s)-inline-modifioijan lisäksi asettaa PCRE_DOTALL-tilan kutsuttaessa funktiota pcre_compile() (tai vastaavaa):

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

Php:ssä PCRE_DOTALL-asetus välitetään s-lipukkeella, jonka voit lisätä regex-merkkijonoosi sulkevan erottimen jälkeen. Voit esimerkiksi käyttää esim:
$block_regex = '~BEGIN .*? END~s';
Python
Pythonissa on (?s) inline-modifikaattorin lisäksi DOTALL-optio. Voit esimerkiksi käyttää:
block_regex = re.compile("BEGIN .*? END", re.IGNORECASE | re.DOTALL)
Java
Javassa on (?s) inline-modifioijan lisäksi DOTALL-vaihtoehto. Voit esimerkiksi käyttää:

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

Ruby: (?m) modifier and m flag
Rubyssä voit käyttää inline-modifieria (?m), esimerkiksi (?m)BEGIN .*? END. Tämä on outo Rubyn erikoisuus, sillä muut moottorit käyttävät (?m)-merkkiä ”^ ja $ täsmäävät jokaisella rivillä” -tilassa.
Katso osiosta inline-modifikaattorit saadaksesi mehukkaita yksityiskohtia kolmesta lisäominaisuudesta: sen kytkeminen päälle merkkijonon puolivälissä, sen kytkeminen pois päältä komennolla (?-m) tai sen soveltaminen vain ei-kiinniottoryhmässä olevaan sisältöön komennolla (?m:foo)
Ruby sallii sinulle myös m-lipputunnisteen lisäämisen regex-merkkijohdon päähän. Voit esimerkiksi käyttää:
block_regex = /BEGIN .*? END/m
(suora linkki)
Origins of DOTALL
Yksirivistä tilaa kutsutaan usein myös nimellä DOTALL (joka on lyhenne sanoista ”dot matches all” eli ”piste vastaa kaikkia”), koska PCRE:ssä on PCRE_DOTALL-optio, Pythonissa re.DOTALL-optio ja Javassa Pattern.DOTALL-optio.
Olen kuullut useita kertoja väitettävän, että ”DOTALL on Pythonin juttu”, mutta tämä tuntui tulevan ihmisiltä, jotka eivät olleet kuulleet vastaavista vaihtoehdoista PCRE:ssä ja Javassa. Silti tämä sai minut miettimään: missä DOTALL ilmestyi ensimmäisenä? PCRE:n muutoslokin ja vanhan Python-dokumentaation perusteella näyttää siltä, että se ilmestyi PCRE:hen versiossa 0.96 (lokakuu 1997), Pythoniin versiossa 1.5 (helmikuu 1998) ja sitten Java 1.4:ään (helmikuu 2002). Aukko PCRE:n ja Pythonin esittelyjen välillä ei ollut ratkaiseva – sana on saattanut olla liikkeellä aiemmissa beta-versioissa tai jopa muissa työkaluissa – joten kysyin asiaa Philip Hazelilta (PCRE:n isältä). Hän vastasi:

Luulen keksineeni sen – en ainakaan ollut nähnyt sitä muualla, kun yritin keksiä nimeä PCRE:n vaihtoehdolle, joka vastaisi Perlin /s-vaihtoehtoa. (”S” tarkoittaa siellä ”single-line” (…), joten halusin paremman nimen.)

Se on siis siinä. Ne, jotka pitävät historiasta, saattavat nauttia tästä maukkaasta nugetista.
(suora linkki)

Monirivinen (^ ja $ täsmäävät jokaisella rivillä): m (paitsi Ruby)

Oletusarvoisesti kaikissa tärkeimmissä moottoreissa Rubya lukuun ottamatta ankkurit ^ ja $ täsmäävät (vastaavasti) vain merkkijonon alussa ja lopussa.
Rubyssä ne täsmäävät jokaisen rivin alussa ja lopussa, eikä ominaisuutta voi poistaa käytöstä. Tämä on itse asiassa järkevä tapa toimia, jolla Ruby lunastaa osittain sen, että se käyttää m:ää DOTALL-tilassa, kun muut moottorit käyttävät s:ää.
Muissa moottoreissa, jos halutaan, että ^Definen ja >>>>$:n kaltaiset kuviot täsmäävät (vastaavasti) jokaisen rivin alussa ja lopussa, meidän on kytkettävä tämä ominaisuus päälle.

Tätä ominaisuutta kutsutaan yleensä moniriviseksi (siksi m), koska ankkurit ^ ja $ toimivat useilla riveillä.
Monissa moottoreissa huomaa, että se voidaan ottaa käyttöön kahdella eri tavalla: rivinsisäisenä muokkaimena (?m) tai valintana regex-metodissa tai -funktiossa.
Ruby
Rubyssa ankkurit ^ ja $ sopivat aina kaikille riveille. Tätä vaihtoehtoa ei voi kytkeä pois päältä. Tämä on itse asiassa varsin mukava tapa toimia, sillä kuten useimmissa mauissa, merkkijonojen alussa ja lopussa on erilliset ankkurit: \A, \Z ja \z.
Toisaalta voi pahoitella Rubyn valintaa käyttää m-lippua ja modifieria epätyypillisellä tavalla (ks. DOTALL).
Inline-modifier (?m)
.NET:ssä, PCRE:ssä (C:ssä, PHP:ssä, R:ssä…), Perl:ssä, Python:ssä, Java:ssä ja Ruby:ssä (mutta ei JavaScript:ssä), voit käyttää inline-modifieria (?m), vaikkapa muodossa (?m)^cat. Katso inline-modifikaattoreita käsittelevästä osiosta mehukkaita yksityiskohtia kolmesta lisäominaisuudesta (joita ei ole saatavilla Pythonissa): sen kytkeminen päälle kesken merkkijonon, sen kytkeminen pois päältä komennolla (?-m) tai sen soveltaminen vain ei-kapteeniryhmän sisältöön komennolla (?m:foo)
.NET
Inline-modifikaattorin (?m) lisäksi .NET-kielissä on käytössä Multiline-valinta. Esimerkiksi C#-kielessä voit käyttää:

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

Perl
Perl
Lisäksi (?m) inline-modifiointiainetta Perlissä voit lisätä m-lipukkeen kuvion sulkevan erottimen jälkeen. Voit esimerkiksi käyttää esim:
if ($the_subject =~ m/^cat/m) { … }
PCRE (C, PHP, R…)
Lisäksi (?m) inline-modifikaattorista PCRE:n avulla voit asettaa PCRE_MULTILINE-tilan kutsuessasi funktiota pcre_compile() (tai vastaavaa):

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

PHp:ssä PCRE_MULTILINE-vaihtoehto siirretään m-lippulauseen välityksellä, jonka voit lisätä regex-merkkijuoksulausekkeeseesi sulkevan erotinmerkin jälkeen. Voit esimerkiksi käyttää esim:
$cat_regex = '~^cat~m';
Python
Pythonissa on (?m) inline-modifikaattorin lisäksi MULTILINE-optio. Voit esimerkiksi käyttää:
cat_regex = re.compile("^cat", re.IGNORECASE | re.MULTILINE)
Java
Javassa on (?m) inline-modifioijan lisäksi MULTILINE-valinta. Voit esimerkiksi käyttää:

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

JavaScript
JavaScriptissa ainoa vaihtoehtosi on lisätä m-lippu kuvion sulkevan erottimen jälkeen. Voit käyttää esimerkiksi:
var catRegex = /^cat/m;
(suora linkki)

Vapaa välilyönti: x (paitsi JavaScript)

Oletusarvoisesti mikä tahansa välilyönti regex-merkkijonossa määrittää sovitettavan merkin. Kielissä, joissa regex-merkkijonoja voi kirjoittaa useammalle riville, rivinvaihdot määrittävät myös sovitettavat kirjainmerkit. Koska et voi lisätä välilyöntejä erottamaan eri merkityksiä sisältäviä ryhmiä toisistaan (kuten englanniksi kirjoitettaessa tehdään fraasien ja pragrafien väliin), regexistä voi tulla vaikealukuinen, kuten esimerkiksi Meaning of Life -regex regexin regex-huumorisivulta:
^(?=(?!(.))()(?-1)(?<!\d(?<=(?!)\d))).$
Onneksi monet moottorit tukevat vapaata välilyöntitilaa, jonka avulla regexiä voi keventää. Voit esimerkiksi lisätä merkkien väliin välilyöntejä. PHP:ssä voisit kirjoittaa näin – huomaa x-merkki viimeisen erottimen ~ jälkeen:
$word_with_digit_and_cap_regex = '~ ^ (?=\D*\d) \w*\w* $ ~x';
Mutta miksi pysyä yhdellä rivillä? Voit levittää regexisi niin monelle riville kuin haluat – sisennyksillä ja lisäämällä kommentteja, jotka aloitetaan #-merkillä. C#-kielessä voit tehdä esimerkiksi näin:

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");

Tätä tilaa kutsutaan vapaaväliksi. Sitä saatetaan kutsua myös whitespace-tilaksi, kommenttitilaksi tai verbose-tilaksi.
Se saattaa olla liikaa yllä olevan kaltaisessa yksinkertaisessa regexissä (vaikka kaikki, joiden on ylläpidettävä koodiasi, kiittävät sinua siitä). Mutta jos rakennat vakavasti otettavaa regex-kuviota, kuten tuossa tempauksessa, joka vastaa numeroita selkokielellä… Ellet ole masokisti, sinulla ei ole valinnanvaraa.
Huomaa, että merkkiluokan sisällä välilyönti-merkki ja #-merkki (joka muutoin esittelee kommentteja) ovat edelleen kunnioitettuja – paitsi Javassa, jossa ne molemmat on pakotettava, jos tarkoituksesi on sovittaa nämä merkit yhteen.
Monissa moottoreissa on kaksi tapaa kytkeä vapaavälitila päälle: rivin sisäisenä muokkaajana tai valintana regex-metodissa tai -funktiossa.
Vapaavälitila on hieno juttu, mutta siinä on pari pientä vaaratekijää, joista kannattaa olla tietoinen, sillä ne saattavat jättää sinut raapimaan päätäsi ihmettelemään, miksi kuvio ei toimi odotetulla tavalla.
Trip Hazard #1: The Meaning of Space
Ensiksi, et voi enää käyttää Number: \d+ vastaamaan merkkijonoa, kuten Number: 24. Syynä on se, että välilyönti kohdassa : \d ei enää vastaa välilyöntiä. Muistatko, että olemme vapaan välilyönnin tilassa? Se on koko homman tarkoitus.

Jotta voit sovittaa välilyönnin, sinun on määritettävä se. Kaksi pääasiallista tapaa tehdä se on sijoittaa se merkkiluokan sisälle tai paeta sitä backslashilla. Kumpikin näistä toimisi: Number:\d+ tai Number:\ \ \d+
Number:\s\d+ sopii tietysti myös, mutta muista, että \s sopii paljon muuhunkin kuin välilyöntiin. Se voi esimerkiksi sopia tabulaattoriin tai rivinvaihtoon. Tämä ei ehkä ole sitä, mitä haluat.
Trip Hazard #2: Myöhäinen aloitus
Toiseksi saatat luottaa liikaa vapaan välilyönnin voimaan ja kokeilla jotakin tämän kaltaista antaaksesi regexin seistä itsekseen:

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

Ongelma tässä on se, että vaikka saattaa näyttääkin siltä, että vapaan välilyönnin modifikaattori (?x) on ensimmäinen asia regexissäsi, se ei ole sitä.
Aloittavan lainausmerkin ” jälkeen on rivinvaihto ja useita välilyöntejä. Moottori yrittää sovittaa ne yhteen, koska tässä vaiheessa emme ole vielä vapaassa tilassa. Tämä tila kytkeytyy päälle vasta, kun kohtaamme (?x). Tämä regex ei koskaan sovita merkkijonoa jne. ja enemmänkin, koska siihen mennessä, kun kohtaamme merkkijonon alkuankkurin ^, meidän pitäisi olla jo sovittaneet rivinvaihdon ja välilyönti-merkit!
Sentähden, jos katsot ensimmäistä esimerkkiä, huomaat, että vapaan välilyönnin modifikaattori (?x) on aivan ensimmäinen asia avaavan lainausmerkin jälkeen.
Välilyöntiä ei vain leikata pois kuviosta
Jopa siitä huolimatta, että välilyönti jätetään huomiotta, välilyönnin sijainti erottaa silti edellisen merkin seuraavasta. Esimerkiksi
✽ (A)\1 2 ei ole sama kuin (A)\12. Edellinen vastaa AA2:ta, jälkimmäinen vastaa A\n:ää .NET:ssä, PCRE:ssä, Perlissä ja Rubyssä (12 on rivinvaihtomerkin oktaalikoodi)
✽ \p{Nd} kelpaa, mutta \p{N d} ei kelpaa – paitsi Perlissä ja Rubyssä
JavaScriptissä
JavaScripthän ei tue vapaan välilyönnin tilaa. JavaScriptiä varten, jos haluat sovittaa minkä tahansa merkin, myös rivinvaihdon, käytä konstruktiota, kuten . Tämä merkkiluokka vastaa yhtä merkkiä, joka on joko muu kuin numero \D tai numero \d. Se sopii siis mihin tahansa merkkiin.
Toinen JavaScript-ratkaisu on käyttää XRegExp-regex-kirjastoa. Jos sinulla on loputtomasti aikaa, voit myös yrittää portata PCRE:n JavaScriptiin Emscriptenin avulla, kuten Firas näyttää tehneen regex 101:ssä.
Inline-modifier (?s)
.NET:ssä, PCRE:ssä (C:ssä, PHP:ssä, R:ssä…), Perl:ssä, Pythonissa, Java:ssa ja Ruby:ssä (mutta ei JavaScriptissä) voit käyttää inline-modifieriä (?x), esimerkiksi tämä on ilmennetty regex toistuvien sanojen täsmäämiseen:

(?x) (\w+) + \bKatso myös inline-modifioijia koskeva osio.
.NET
Lisäksi (?x) inline-modifioijasta .NET-kielissä on IgnorePatternWhitespace-vaihtoehto. Esimerkiksi C#-kielessä voit käyttää:

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

Perl
Perl
Lisäksi (?x) inline-modifiointiainetta Perlissä voit lisätä x-merkin kuvion sulkevan erottimen jälkeen. Voit esimerkiksi käyttää esim:
if ($the_subject =~ m/(\w+) + \b/x) { … }
PCRE (C, PHP, R…)
Lisäksi (?x) inline-modifiointiainetta, PCRE:n avulla voit asettaa PCRE_EXTENDED-tilan kutsuessasi pcre_compile()- (tai vastaavaa) funktiota:

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

PHp:ssä PCRE_EXTENDED-vaihtoehto siirretään x-lipukkeen avulla, jonka voit lisätä regex-merkkijonoihisi sulkeutuvan rajaajan jälkeen. Voit esimerkiksi käyttää esim:
$repeated_word_regex = '~(\w+) + \b~x';
Python
Pythonissa on (?x) inline-modifikaattorin lisäksi VERBOSE-optio. Voit esimerkiksi käyttää:
repeated_word_regex = re.compile(r"(\w+) + \b", re.VERBOSE)
Java
Muista moottoreista poiketen Javan merkkiluokan sisällä hasheja esittävät kommentit ja välilyönnit jätetään huomioimatta, joten sinun on vältettävä ne, jos haluat käyttää näitä merkkejä luokassa, esimerkiksi +
Javalla on (?x)-inline-modifioijan lisäksi COMMENTS-vaihtoehto. Voit esimerkiksi käyttää:

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

Ruby
Ruby
Lisäksi (?x) inline-modifiointiainetta, Ruby antaa sinun lisätä x-merkin regex-merkkijonon loppuun. Voit esimerkiksi käyttää esim:
repeated_word_regex = /(\w+) + \b/x
(suora linkki)

Muut modifikaattorit

Jotkut moottorit tukevat modifikaattoreita ja lippuja i:n, s:n, m:n ja x:n lisäksi. Suunnittelen käsitteleväni niitä kyseisille mauille omistetuilla sivuilla.
Esimerkiksi
✽ .NET:ssä on käytössä (?n)-modifikaattori (jota pääsee käyttämään myös valinnalla ExplisiittinenKapteeni). Tämä muuttaa kaikki (suluissa olevat) ryhmät ei-kiinnittäviksi ryhmiksi. Jos haluat kaapata, sinun on käytettävä nimettyjä ryhmiä.
✽ Javassa on (?d) -muunnin (käytettävissä myös UNIX_LINES-valinnalla). Kun tämä on päällä, rivinsyöttömerkki \n on ainoa, joka vaikuttaa pisteeseen . (joka ei sovi rivinvaihtoon, ellei DOTALL ole päällä) ja ankkureihin ^ ja $ (jotka sopivat rivin alkuihin ja loppuihin monirivisessä tilassa.)
✽ Perlissä on useita muitakin lipukkeita. Katso dokumentaation modifier-osio.
✽ PCRE:llä on (?J) modifier (käytettävissä myös koodissa PCRE_DUPNAMES-valinnalla). Kun se on asetettu, eri kaappausryhmät voivat käyttää samaa nimeä – vaikka niille annetaankin eri numerot.

(suora linkki)
✽ PCRE:llä on (?U)-muunnin (käytettävissä myös koodissa PCRE_UNGREEDY-valinnalla). Kun se on asetettu, kvanttorit ovat oletusarvoisesti ahneettomia. Liittämällä ? ne muuttuvat ahneiksi.
(suora linkki)
✽ PCRE:ssä on (?X)-muunnin (käytettävissä myös koodissa PCRE_EXTRA-valinnalla). Historiallisesti tätä moodia on käytetty uusien ominaisuuksien mahdollistamiseen kehityksessä. Tällä hetkellä se laukaisee virheitä, jos merkkejä, kuten \B, käytetään merkkiluokassa (jossa se tavallisesti vastaa isoa B-kirjainta, toisin kuin merkkiluokan ulkopuolella, jossa se on ei-sanaa-rajaava väite).
✽ PCRE:llä on useita erikoismodifikaattoreita, jotka voidaan asettaa kuvion alussa (nämä on esitetty alla). Lisäksi monia asetuksia voidaan lähettää pcre_compile()-funktioperheeseen, jos sinulla on pääsy niihin. Lisätietoja näistä saat pcre_compile.html-tiedostosta doc-kansiosta lataamalla PCRE:n.
(suora linkki)

PCRE:n erityiset kuvion alun modifioijat

PCRE:ssä on useita ”erityismodifioijia”, joita voit asettaa kuvion alussa. Normaalin (?z)-syntaksin sijasta erikoismodifiointisyntaksi näyttää (*MYMODIFIER). Nämä modifioijat ovat erityisen hyödyllisiä tilanteissa, joissa PCRE on integroitu työkaluun tai kieleen – ne korvaavat useita vaihtoehtoja, jotka lähetät pcre_compile()-ohjelmalle.
UTF-merkkijonot
Edellyttäen, että PCRE on käännetty asiaankuuluvilla optioilla, voit käskeä moottoria käsittelemään aihemerkkijonoa erityyppisinä UTF-merkkijonoina.
✽ (*UTF) on yleinen tapa käsitellä aihemerkkijonoa UTF-merkkijonona-tunnistaen, pitäisikö sitä käsitellä UTF-8-, UTF-16- vai UTF-32-merkkijonona.
✽ (*UTF8), (*UTF16) ja (*UTF32) käsittelevät merkkijonoa yhtenä kolmesta tietystä UTF-koodauksesta.
Unicode-ominaisuudet \d:lle ja \w:lle
Oletusarvoisesti \d vastaa vain ASCII-numeroita, kun taas \w vastaa vain ASCII-numeroita, -kirjaimia ja -merkkejä.
Muunnin (*UCP) (joka on lyhenne sanoista Unicode Character Properties) sallii näiden merkkien sovittaa Unicode-numeroita ja sanamerkkejä.
Esimerkiksi (*UCP)\d+ :: \w+ vastaa 1۳۲١८৮੪ :: Aれま래도ᚠᚱᚩ
(Katso demo).
Yhdessä (*UCP) kanssa voit joutua käyttämään myös jotakin (*UTF) -modifiointia. Nähdäksesi, miten tämä toimii, tarkastele tämän ohjelman tulostusta tavallisella Xampp PHP:llä:

$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)

Rivinvaihtomodifikaattorit
Oletusarvoisesti PCRE:tä käännettäessä kerrot sille, mitä pitää rivinvaihtona, kun se kohtaa .:n (koska piste se ei sovita rivinvaihtoja, ellei se ole dotall-moodissa), samoin kuin ^- ja $-ankkureiden käyttäytyminen monirivimoodissa. Voit ohittaa tämän oletusarvon seuraavilla määritteillä:
✽ (*CR) Vain rivinvaihtoa pidetään rivinvaihtona
✽ (*LF) Vain rivinvaihtoa pidetään rivinvaihtona (kuten Unixissa)
✽ (*CRLF) Vain rivinvaihtoa, jota seuraa rivinvaihto on katsotaan rivinvaihdoksi (kuten Windowsissa)
✽ (*ANYCRLF) Mikä tahansa edellä mainituista kolmesta katsotaan rivinvaihdoksi
✽ (*ANY) Mikä tahansa Unicoden rivinvaihtosekvenssi katsotaan rivinvaihdoksi
Esim, (*CR)\w+.\w+ täsmää rivin1\nLine2 kanssa, koska piste pystyy täsmäämään \n:n kanssa, jota ei pidetä rivinvaihtona. Katso demo.
Ohjaus \R
Metamerkki \R vastaa oletusarvoisesti mitä tahansa Unicoden rivinvaihtosekvenssiä. Kun UTF-8-tila on pois päältä, näitä rivinvaihtosekvenssejä ovat \r\n-pari sekä rivinvaihto-, rivinvaihto-, pystysuuntainen tabulaattori-, lomakesyöttö- tai seuraavan rivin merkit. UTF-8-tilassa merkki täsmää myös rivinvaihtajan ja kappaleen erottelumerkin kanssa.
Kahdella kuvion alun muokkaajalla voit muuttaa \R:n käyttäytymistä:
✽ Kun (*BSR_ANYCRLF), \R täsmää vain \r\n-sekvenssiä, \r tai \n. Tämä voidaan asettaa myös, kun PCRE käännetään tai sitä pyydetään PCRE_BSR_ANYCRLF-optiolla
✽ With (*BSR_UNICODE), \R vastaa mitä tahansa Unicode-viivajaksoa (ohittaa PCRE_BSR_ANYCRLF-option, jos se on asetettu). Tämä voidaan asettaa myös, kun PCRE käännetään tai sitä pyydetään PCRE_BSR_UNICODE-optiolla
Runway Patterns
Controling Runaway Patterns
Voidaksesi rajoittaa, kuinka monta kertaa PCRE kutsuu match()-funktiota, käytä (*LIMIT_MATCH=x)-modifikaattoria asettaen x haluttuun määrään.
Rekursion rajoittamiseksi käytä (*LIMIT_RECURSION=d), asettaen d syvimmälle sallitulle rekursiotasolle.
Optimointien kytkeminen pois päältä
(suora linkki)
Oletusarvoisesti PCRE tutkii kuviota ja tekee automaattisesti kvantifioidusta merkistä atomisoituvan, kun sitä seuraava merkki on yhteensopimaton – esimerkiksi muuttamalla A+X:n muotoon A++X. Muunnin (*NO_AUTO_POSSESS) poistaa tämän optimoinnin käytöstä. Käytä tätä, kun haluat käyttää pcretestiä kahden kuvion vertailemiseen ja saada itsesi tuntemaan olosi hyväksi kaikista sykleistä, joita automaattinen poseeraus säästää.
PcRE suorittaa oletusarvoisesti useita optimointeja saadakseen nopeammin selville, epäonnistuuko vastaavuus. (*NO_START_OPT)-muunnin poistaa nämä optimoinnit käytöstä.
Tyhjien osumien poistaminen käytöstä
Pcre2:ssa (*NOTEMPTY) kertoo moottorille, ettei se palauta tyhjiä osumia. Samoin (*NOTEMPTY_ATSTART) kertoo moottorille, ettei se palauta aiheen alussa löydettyjä tyhjiä osumia.
Automaattisen ankkurointioptimoinnin poistaminen käytöstä
PCRE2:ssa PCRE2_NO_DOTSTAR_ANCHOR kertoo moottorille, ettei se automaattisesti ankkuroi kuvioita, jotka alkavat .*
Lue lisää tästä lipusta PCRE2 API -sivulta (etsi hakusanalla PCRE2_NO_DOTSTAR_ANCHOR).

Älkää jättäkö väliin The Regex Style Guide
ja The Best Regex Trick Ever!!!


The 1001 ways to use Regex

Vastaa

Sähköpostiosoitettasi ei julkaista.