Regex probatzailea
Idatzi eredu bat, markatu behar dituzun banderak eta itsatsi testua: bat-etortze guztiak idatzi ahala nabarmentzen dira, eta haien posizioarekin eta harrapatze-taldeekin zerrendatzen dira. Ereduak zure nabigatzailearen JavaScript regex motorrean exekutatzen dira; beraz, emaitzak zure kodearenak bezalakoak dira eta testua zure gailuan geratzen da.
0 karaktere · 0 hitz · 0 lerro
Bat-etortzeak hemen nabarmentzen dira.0 karaktere · 0 hitz · 0 lerro
Nabigatzaile-fitxa honetan bertan exekutatzen da. Zure testua ez da inoiz igotzen edo gordetzen.
JavaScript regex tokenak
Lehen bat-etortzearen zutabea eredu bakoitza bere testuan orri hau eraiki zuen JavaScript motorrarekin exekutatuta sortu zen.
| Tokena | Esanahia | Eredua | Testua | Lehen bat-etortzea |
|---|---|---|---|---|
\d | 0–9 digitua | /\d+/ | Order 66 shipped | 66 |
\w | Letra, digitua edo azpimarra (ASCII) | /\w+/ | snake_case-id | snake_case |
\s | Zuriunea, tabulazioak eta lerro-jauziak barne | /\s+/ | two spaces | |
. | Lerro-jauzia ez den edozein karaktere (s ez bada) | /a.c/ | abc a-c | abc |
^ $ | Sarreraren (edo lerroaren, m-rekin) hasiera eta amaiera | /^\w+$/ | single | single |
[abc] | Zerrendatutako karaktereetako bat | /[aeiou]/ | rhythm and blues | a |
[^abc] | Zerrendatu gabeko edozein karaktere | /[^0-9]+/ | 2026-10-18 | - |
* + ? | 0 edo gehiago, 1 edo gehiago, 0 edo 1 | /colou?r/ | color colour | color |
{n,m} | n eta m aldiz bitartean | /\d{2,4}/ | 7 42 1999 123456 | 42 |
(…) | Harrapatze-taldea | /(\d+)px/ | width: 320px | 320px |
(?<name>…) | Harrapatze-talde izendunak | /(?<h>\d\d):(?<m>\d\d)/ | at 09:45 | 09:45 |
(?:…) | Harrapatu gabeko taldea | /(?:ab)+/ | ababab! | ababab |
a|b | Alde bietako bat | /cat|dog/ | hotdog | dog |
\b | Hitz-muga | /\bcat\b/ | concat cat | cat |
(?=…) | Honek jarraituta (lookahead) | /\d+(?=%)/ | 50 of 75% | 75 |
(?<!…) | Honen aurretik ez (negative lookbehind) | /(?<!\$)\b\d+/ | $30 or 40 | 40 |
\p{L} | Edozein Unicode letra (u behar du) | /\p{L}+/u | naïve 東京 | naïve |
Sei banderak eta zer aldatzen duten
g (global) bat-etortze guztiak aurkitzen ditu, lehenengoan gelditu beharrean; gabe, zerrendak sarrera bakarra izango du. i letra larriak eta xeheak berdintzat hartzen ditu. m (multiline) adierazpenak ^ eta $ testu osoaren hasieran eta amaieran ez ezik, lerro bakoitzaren hasieran eta amaieran ere bat etortzea lortzen du; hori da behar duzuna amaierako zuriuneak bezalako eredu baterako. s (dotAll, ES2018n gehitua) adierazpenak . lerro-jauziekin ere bat etortzen uzten du. u (unicode) adierazpenak testua kode-puntu gisa tratatzen du, beraz emoji bat karaktere bakartzat hartzen da, eta \p{L} bezalako propietate-ihesbideak gaitzen ditu, edozein idazkeratako edozein letrarentzat. y (sticky) uneko posizioan bertan bakarrik egiten du bat; tokenizatzaileek erabiltzen duten modua da. JavaScript-ek d ere badu (bat-etortzeen indizeetarako) eta v (klaseetako multzo-eragiketetarako); proba-tresna honek goiko seiekin jarraitzen du.
Probako testuaren azpian, bat-etortze bakoitzak bere indizea eta taldeak erakusten ditu. Zenbakitutako taldeak parentesi arruntetatik datoz, (?:…) taldeek ez dute harrapatzen, eta (?<year>\d{4}) izeneko talde bat sortzen du, izenarekin agertzen dena, ISO dataren adibideak erakusten duen bezala. Eredu arruntak menuak posta elektronikoko helbideetarako, URLetarako, IPv4 helbideetarako, kolore hexadezimalak, UUIDetarako, errepikatutako hitzetarako eta amaierako zuriuneetarako proba-puntu fidagarriak txertatzen ditu. Hartu posta elektronikoaren eredua egiaztapen azkar gisa, ez baliozkotze gisa: helbide osoaren gramatika askoz malguagoa da, eta benetako proba mezu bat bidaltzea da.
Lookbehind eta atzerakako bilaketa katastrofikoa
Lookaround-ek posizio baten inguruan dagoena egiaztatzen du, hura kontsumitu gabe. Lookahead-a, (?=…) eta (?!…), beti izan da JavaScript-en parte; lookbehind-a, (?<=…) eta (?<!…), ES2018n iritsi zen eta nabigatzaile nagusi guztietara heldu zen Safari 16.4-k 2023an gehitu zuenean. Beraz, (?<=\$)\d+ adierazpenak 42 aurkitzen du "$42" testuan, dolar ikurra barne hartu gabe. Beste motor askotan ez bezala, JavaScript-ek edozein luzeratako lookbehind-a onartzen du.
JavaScript motorra atzera-egitezkoa da (backtracking): bide batek huts egiten duenean, atzera egin eta alternatibak probatzen ditu. (a+)+$ bezalako kuantifikatzaile habiaratuek testu bera banatzeko modu esponentzial asko ematen dizkiote, beraz 30 a-ren segida batek eta ondoren x batek segundoak behar ditzake, eta letra gutxi batzuk gehiagok orduak. Hori atzera-egite katastrofikoa da, eta zerbitzarietan ReDoS bihurtzen da, zerbitzu-ukapeneko eraso bat; akats hori zuen WAF arau bakar batek Cloudflare-ren sarea erori zuen ordu erdiz inguru, 2019ko uztailaren 2an. Proba-tresna hau zure fitxan exekutatzen denez, eredu horrek orria izoztu dezake; birkargatu eta berridatzi bi kuantifikatzailek karaktere berberak har ez ditzaten, .* ordez [^,]* bezalako klase estuagoak edo ainguak erabiliz. Testua bera editatzeko, bat-etortzeko beharrean, ikusi testu-tresnak; garatzaileentzako utilitate gehiago garatzaile-tresnak gunean daude.
Maiz egiten diren galderak
- Zergatik aurkitzen du nire regex-ak bat-etortze bakarra?
- g bandera desaktibatuta dago. Gabe, motorra lehenengo bat-etortzearen ondoren gelditzen da. Markatu g agerraldi guztiak zerrendatzeko; y banderak bakarrik ere hainbat aurkitzen ditu, baina elkarren segidan badaude soilik.
- \d-k beste idazkera batzuetako digituak hartzen ditu JavaScript-en?
- Ez. JavaScript-en \d 0tik 9ra bitartekoak soilik dira eta \w ASCII letrak, zifrak eta azpimarra soilik, u banderarekin ere. Beste idazkerentzat erabili \p{Nd} edo \p{L} u-rekin.
- Hemen probatutako eredu batek berdin jokatuko du Python edo PHP-n?
- Oinarrizko sintaxia berdina da, baina xehetasunak aldatzen dira: Python-en talde izendunak
(?P<name>…)idazten dira, PHP-k eta Python-ek JavaScript-ek ez dituen kuantifikatzaile jabeduneak onartzen dituzte, eta lookbehind-aren arauak aldatu egiten dira. Probatu berriro helburuko motorrean. - Nola bilatu puntu edo parentesi literal bat?
- Ihes egin atzerako barra batekin:
\.puntu batekin egiten du bat eta\[kortxete irekitzaile batekin. Karaktere-klase baten barruan ikur gehienak literalak dira dagoeneko, beraz[.]ere puntu batekin soilik egiten du bat. - Zergatik izoztu da orria eredu bat idazten ari nintzela?
- Seguruenik ereduak atzera-egite katastrofikoa eragin du zure testuan. Birkargatu, eta saihestu
(.*)*edo(a+)+bezalako kuantifikatzaile habiaratuak; egin ezazu zati bakoitzak ahal bezain gutxi har dezan.