Säännölliset lausekkeet ihmisille: käytännöllinen opas
Säännöllisillä lausekkeilla (regex) on maineongelmansa. Ne näyttävät kuin joku olisi nukahtanut näppäimistölleen: ^[\w.-]+@[\w-]+\.[\w.]+$. Ne esiintyvät koodikatselmuuksissa, tekstieditoreissa, hakutyökaluissa ja lomakkeiden validoinnissa. Kehittäjät joko rakastavat niitä tai välttelevät niitä kokonaan.
Totuus on jossain siltä väliltä. Regex on aidosti tehokas. Se on myös aidosti hämmentävä aluksi. Mutta sinun ei tarvitse hallita jokaista epäselvää ominaisuutta saadaksesi käytännöllistä arvoa. Kourallinen malleja kattaa valtaosan todellisen maailman käyttötapauksista.
Mitä regex oikeasti tekee
Säännöllinen lauseke on malli joka kuvaa joukkoa merkkijonoja. Annat sen hakutyökalulle ja se löytää jokaisen merkkijonon joka vastaa mallia. Ajattele sitä erittäin täsmällisenä hakukyselynä.
Normaali haku: etsi täsmälleen "hei" Regex-haku: etsi kaikki joka näyttää sähköpostiosoitteelta, puhelinnumerolta, päivämäärältä, URL:lta tai mistä tahansa muusta mallilta jonka pystyt kuvaamaan.
Tiesitkö? Säännölliset lausekkeet keksi matemaatikko Stephen Kleene vuonna 1956 merkintätapana "säännöllisten kielten" kuvaamiseen muodollisen kielen teoriassa. Ne löysivät tiensä tietojenkäsittelyyn varhaisten Unix-tekstieditoreiden kautta 1960- ja 1970-luvuilla.
Rakennuspalikat
Literaalimerkit
Yksinkertaisin regex on vain kirjaimellinen teksti. Malli hei vastaa merkkijonoa "hei". Ei mitään hienoa.
Piste (.) – mikä tahansa yksittäinen merkki
Piste vastaa mitä tahansa yksittäistä merkkiä (paitsi rivinvaihtoa).
h.tvastaa "hat", "hit", "hot", "hut" ja jopa "h3t"
Merkkiluokat ([]) – tietyt merkit
Hakasulkeet määrittävät joukon sallittuja merkkejä kyseisessä kohdassa.
[aeiou]vastaa mitä tahansa yksittäistä vokaalia[0-9]vastaa mitä tahansa numeroa[A-Za-z]vastaa mitä tahansa kirjainta (isot tai pienet kirjaimet)[^0-9]vastaa mitä tahansa merkkiä joka EI ole numero (^hakasulkeiden sisällä tarkoittaa "ei")
Kvantifioijat – kuinka monta
Nämä symbolit hallitsevat toistoa:
| Symboli | Merkitys | Esimerkki | Vastaa |
|---|---|---|---|
* |
Nolla tai enemmän | ab*c |
"ac", "abc", "abbc", "abbbc" |
+ |
Yksi tai enemmän | ab+c |
"abc", "abbc", "abbbc" (ei "ac") |
? |
Nolla tai yksi | colou?r |
"color" ja "colour" |
{3} |
Täsmälleen 3 | a{3} |
"aaa" |
{2,4} |
2 ja 4 välillä | a{2,4} |
"aa", "aaa", "aaaa" |
Ankkurit – asema
^alussa tarkoittaa "merkkijonon alkua"$lopussa tarkoittaa "merkkijonon loppua"^hei$vastaa vain täsmällistä merkkijonoa "hei", ei "sano hei" tai "hei maailma"
Lyhennelmäluokat
Yleisillä merkkiluokilla on pikakuvakkeet:
| Lyhenne | Vastaava | Merkitys |
|---|---|---|
\d |
[0-9] |
Mikä tahansa numero |
\w |
[A-Za-z0-9_] |
Mikä tahansa "sana"-merkki |
\s |
[ \t\n\r] |
Mikä tahansa välilyönti |
\D |
[^0-9] |
Mikä tahansa ei-numero |
\W |
[^A-Za-z0-9_] |
Mikä tahansa ei-sana-merkki |
\S |
[^ \t\n\r] |
Mikä tahansa ei-välilyönti |
Ryhmät (()) – ryhmittely ja talteenotto
Sulkeet ryhmittelevät osia mallista. Tämä on hyödyllistä kvantifioijien soveltamiseen ryhmälle tai tiettyjen osien poimimiseen vastaavuudesta.
(ab)+vastaa "ab", "abab", "ababab"(\d{3})-(\d{4})vastaa "555-1234" ja tallentaa "555" ja "1234" erikseen
Putki (|) – tai
Putki tarkoittaa "tai".
kissa|koiravastaa "kissa" tai "koira"(jpg|png|gif)vastaa mitä tahansa näistä kolmesta kuvan laajennuksesta
Käytännölliset mallit joita voit käyttää tänään
Sähköpostiosoitteen vastaaminen (yksinkertainen)
[\w.-]+@[\w-]+\.[\w.]+
Pilkotaan se osiin:
[\w.-]+— yksi tai useampi sanamerkki, piste tai viiva (paikallinen osa)@— kirjaimellinen @-merkki[\w-]+— yksi tai useampi sanamerkki tai viiva (domain)\.— kirjaimellinen piste (escapoitu koska.on erikoismerkki)[\w.]+— yksi tai useampi sanamerkki tai piste (TLD)
Varoitus Sähköpostivalidointi regexillä on tunnetusti vaikea tehdä täydellisesti. Yllä oleva yksinkertainen malli kattaa 99 % todellisen maailman sähköpostiosoitteista mutta ei käsittele jokaista RFC-spesifikaation reunatapausta. Tuotantovalidoinnissa käytä ohjelmointikielesi sähköpostivalidointikirjastoa.
Puhelinnumeron vastaaminen (US-muoto)
\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}
Tämä vastaa:
- (555) 123-4567
- 555-123-4567
- 555.123.4567
- 555 123 4567
URL:n vastaaminen
https?://[\w.-]+(/[\w./-]*)?
Tämä vastaa:
Päivämäärän vastaaminen (VVVV-KK-PP)
\d{4}-\d{2}-\d{2}
Tämä vastaa: 2026-03-23, 1999-12-31 jne.
Toistuvien sanojen löytäminen
\b(\w+)\s+\1\b
Tämä vastaa toistuvia sanoja kuten "the the" tai "on on". \1 viittaa takaisin siihen mitä ensimmäinen ryhmä kaappasi.
IPv4-osoitteen vastaaminen
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
Tämä vastaa malleja kuten 192.168.1.1 tai 10.0.0.255.
Vinkkejä regexin kirjoittamiseen
1. Aloita yksinkertaisesta, sitten hienosäädä
Älä yritä kirjoittaa täydellistä regexiä ensimmäisellä yrityksellä. Aloita laajalla mallilla, testaa sitä datallasi ja tiukenna sitä.
2. Testaa aina
Regex on helppo saada väärin. Puuttuva kvantifioija tai escapoimaton piste voi täysin muuttaa mitä vastaa. Testaa aina malliasi todellisen maailman datalla ennen sen käyttöä tuotannossa.
3. Escapoi erikoismerkit
Jos täytyy vastata kirjaimellista pistettä, sulkua, hakasulkua tai muuta erikoismerkkiä, escapoi se kenoviivalla: \., \(, \[.
4. Käytä kommentteja ja nimettyjä ryhmiä
Monimutkaisissa malleissa käytä nimettyjä ryhmiä ja kommentteja (missä tuettu) tehdäksesi regexistä luettavan. Tuleva itsesi kiittää sinua.
5. Tiedä milloin EI käyttää regexiä
Regex on väärä työkalu HTML:n, XML:n, JSON:n tai minkä tahansa sisäkkäisen rakenteen jäsentämiseen. Käytä asianmukaista jäsennintä niihin.
Vinkki Testaa ja virheenkorjaa regex-mallisi reaaliajassa: Kuinka testata regex-malleja. Liitä mallisi ja testidatasi ja katso vastaavuudet korostettuna välittömästi.
Ala testaamaan regexiä heti nyt:
Ilmainen, välitön palaute eikä rekisteröitymistä tarvita.