Ugrás a tartalomhoz

Regex-puska

A reguláris kifejezések elég tömörek ahhoz, hogy a szintaxist könnyebb kikeresni, mint megjegyezni. Ez az oldal az egésze egyetlen képernyőn — osztályok, kvantorok, horgonyok, csoportok, lookaround, escape-elés és a módosítók —, minden sorhoz egy működő példával.

A dialektus a JavaScript, ez fut a böngésződben, és ezt használja az oldal regex-tesztelője is. Nagy része azonos a Pythonban, Javában, Góban és a PCRE-ben; ahol a dialektusok eltérnek, a széleken térnek el — a lookbehind-támogatás, a nevesített csoportok szintaxisa, és hogy a \d „ASCII-számjegyet” vagy „bármely Unicode-számjegyet” jelent-e.

Két dolog okozza a meglepetések többségét. A kvantorok mohók: mindent elvesznek, amit tudnak, és csak akkor adnak vissza, ha a minta többi része megbukik, ezért nyeli el a <.+> két címkét, a <.+?> pedig nem. És az alternáció köt a leglazábban, így a ^a|b$ azt jelenti, hogy „a-val kezdődik vagy b-re végződik” — nem azt, amit a legtöbben szánnak neki, amikor leírják.

Karakterosztályok

11

A rövidítések ASCII-korlátozottak, hacsak nem adod hozzá az u módosítót és nem használsz Unicode tulajdonság-escape-eket.

SzintaxisJelentésPélda
.Bármely karakter, kivéve a sortöréstAdd hozzá az s módosítót, hogy a soremelésekre is illeszkedjen./a.c/"abc" "abc"
\dEgy számjegy, 0–9/\d+/"order 42" "42"
\DBármi, ami nem számjegy/\D+/"42abc" "abc"
\wBetű, számjegy vagy aláhúzásCsak ASCII — az „é” nem \w./\w+/"user_1!" "user_1"
\WBármi, amire a \w nem illeszkedik/\W+/"a++b" "++"
\sBármely térköz, beleértve a tabulátorokat és soremeléseket/\s+/"a \t b" " \t "
\SBármely nem térköz karakter/\S+/" hi" "hi"
[abc]A felsorolt karakterek bármelyike/[aeiou]/"rhythm and" "a"
[^abc]Bármely karakter, kivéve a felsoroltakat/[^aeiou ]+/"aeiou xyz" "xyz"
[a-z]Karakterek egy tartománya/[a-f]+/"zzabcz" "abc"
\p{L}Bármely Unicode-betű (az u módosítóra van szükség)/\p{L}+/"42 café" "café"

Kvantorok

7

Ezek mind alapból mohók: annyit vesznek, amennyit tudnak, és csak akkor adnak vissza, ha a minta többi része megbukik.

SzintaxisJelentésPélda
*Nulla vagy több/ab*/"a" "a"
+Egy vagy több/ab+/"abbb" "abbb"
?Nulla vagy egy — opcionálissá teszi/colou?r/"color" "color"
{3}Pontosan három/\d{3}/"id 12345" "123"
{2,}Kettő vagy több/a{2,}/"aaa" "aaa"
{2,4}Kettő és négy között/a{2,4}/"aaaaa" "aaaa"
*?Lusta — a lehető legkevesebbet vesziA mohó <.+> mindkét címkét elnyelné./<.+?>/"<a><b>" "<a>"

Horgonyok és határok

4

Ezek egy pozícióra illeszkednek, nem egy karakterre, így semmit sem fogyasztanak.

SzintaxisJelentésPélda
^A karakterlánc eleje, vagy egy soré az m módosítóval/^a/"abc" "a"
$A karakterlánc vége, vagy egy soré az m módosítóval/c$/"abc" "c"
\bEgy szóhatárEz az, ami megakadályozza, hogy a "cat" illeszkedjen a "concatenate" belsejében./\bcat\b/"the cat sat" "cat"
\BNem szóhatár/\Bcat/"concatenate" "cat"

Csoportok és alternáció

5
SzintaxisJelentésPélda
(abc)Rögzítő csoport — helyettesítéshez megjegyezve/(\d+)-(\d+)/"10-20" "10-20"
(?:abc)Csoportosítás rögzítés nélkülHasználd ezt, ha csak a csoportosításra van szükséged; így a rögzítési számok értelmesek maradnak./(?:ab)+/"abab" "abab"
(?<name>…)Nevesített rögzítő csoport/(?<year>\d{4})/"in 2026" "2026"
a|bBármelyik oldal — alternációAz alternációnak van a legalacsonyabb precedenciája: a ^a|b$ „^a” vagy „b$”, nem „^(a|b)$”./cat|dog/"one dog" "dog"
\1Visszahivatkozás az első csoportra/(\w)\1/"letter" "tt"

Lookaround

4

Állítások arról, ami körülvesz egy pozíciót. Maguk semmire sem illeszkednek, és épp ez teszi őket biztonságosan kombinálhatóvá.

SzintaxisJelentésPélda
(?=…)Lookahead — ez követi/\d+(?= kg)/"80 kg" "80"
(?!…)Negatív lookahead — nem ez követi/\d+(?! kg)/"80 lb" "80"
(?<=…)Lookbehind — ez előzi meg/(?<=\$)\d+/"costs $40" "40"
(?<!…)Negatív lookbehind — nem ez előzi meg/(?<!\$)\b\d+/"about 40" "40"

Escape-elés

5

Ez a tizenkét karakter az, amelyeknek fordított perjelre van szükségük, hogy szó szerint értelmezzék őket.

SzintaxisJelentésPélda
\.Egy szó szerinti pont/\d\.\d/"v2.5" "2.5"
\\Egy szó szerinti fordított perjel/\\/"C:\\dir" "\\"
\nEgy soremelés/a\nb/"a\nb" "a\nb"
\tEgy tabulátor/a\tb/"a\tb" "a\tb"
\uFFFFEgy karakter a kódpontja alapján/\u00e9/"café" "é"

Módosítók

6
MódosítóNévJelentés
gGlobálisMinden találatot megtalál, nemcsak az elsőt.
iKis- és nagybetű figyelmen kívül hagyásaIlleszkedik a kis- és nagybetűktől függetlenül.
mTöbbsorosA ^ és a $ minden sortörésnél illeszkedik, nem csak a karakterlánc végein.
sDot allEngedi, hogy a . a sortörésekre is illeszkedjen.
uUnicodeA mintát kódpontokként kezeli, és engedélyezi a \p{…} tulajdonság-escape-eket.
yRagadósCsak pontosan a lastIndex pozíciónál illeszkedik, sosem keres előre.

Gyakori kérdések

Mi a különbség a mohó és a lusta kvantorok között?
A mohó kvantorok (*, +, {2,}) a lehető legtöbbet illesztik, és csak akkor adnak vissza karaktereket, amikor a minta többi része nem tud illeszkedni. A ? hozzáadása lustává teszi őket: a lehető legkevesebbet illesztik, és csak kényszer hatására vesznek többet. A "<a><b>" esetén a <.+> minta a teljes karakterláncot adja vissza, a <.+?> pedig csak a <a>-t.
Miért illeszkedik a szavam más szavak belsejében?
Mert semmi sem horgonyozta le. Vedd körül a szót \b-vel — a /\bcat\b/ illeszkedik a "cat"-re a "the cat sat" mondatban, de nem a "concatenate" belsejében. A \b egy szókarakter és egy nem szókarakter közötti pozícióra illeszkedik, így semmit sem fogyaszt.
Mit változtat meg az u módosító?
A mintát kódpontokon működteti UTF-16-egységek helyett, így egyetlen emodzsi egy karakternek számít, és engedélyezi a \p{…} tulajdonság-escape-eket, például a \p{L}-t „bármely betű” jelentéssel. Nélküle a \w és a \d ASCII-korlátozott marad, ezért nem illeszkedik teljesen a "café" a /\w+/-ra.
Mikor használjak nem rögzítő csoportot?
Amikor a csoportosításra van szükséged, de a rögzített szövegre nem — (?:ab)+ a (ab)+ helyett. A rögzítés némi teljesítménybe kerül, de az igazi ok a számozás: minden hozzáadott rögzítő csoport eltolja az utána következők számait, csendben elrontva a $1-et és $2-t használó helyettesítéseket.
Biztonságos-e a lookbehind használata?
A jelenlegi böngészőkben és Node-ban igen — a (?<=…) és a (?<!…) minden nagyobb motorban támogatott 2018 óta. A Safari adta hozzá utoljára. Ha nagyon régi futásidőket célzol, előbb ellenőrizd; a regex-szintaxishoz nincs polyfill.