Säännöllisillä lausekkeilla on maine satunnaiselta kohinalta näyttävinä. Kaava kuten ^[\w.-]+@[\w-]+\.\w{2,}$ voi tuntua siltä kuin kissa olisi kävellyt näppäimistön yli. Mutta kryptisen syntaksin takana piilee huomattavan elegantti idea: tiivis kieli tekstin kaavojen kuvaamiseen.
Olitpa validoimassa lomakesyötteitä, etsimässä lokitiedostoista, siivoamassa dataa tai tekemässä etsi-ja-korvaa-operaatiota koodikannassa, regex on yksi monipuolisimmista työkaluista kehittäjän työkalupakissa. Eikä sinun tarvitse opetella jokaista hämärää ominaisuutta saadaksesi todellista hyötyä siitä. Kourallinen rakennuspalikoita kattaa valtaosan käytännön tarpeista.
Mitä regex oikeastaan tekee
Säännöllinen lauseke (regex tai regexp) on kaava, joka kuvaa joukon merkkijonoja. Annat sen hakukoneelle — ohjelmointikielessäsi, tekstieditorissasi tai komentorivityökalussasi — ja se löytää jokaisen vastaavan merkkijonon.
Ajattele sitä parannettuna hakukyselynä:
- Tavallinen haku: etsi tarkka sana "error"
- Regex-haku: etsi kaikki mikä näyttää IP-osoitteelta, päivämäärältä, sähköpostiosoitteelta tai miltä tahansa rakenteelta, jonka voit kuvata
Regexin keksi matemaatikko Stephen Kleene vuonna 1956, ja se tuli tietojenkäsittelyyn Unix-tekstieditorien kautta 1960-luvulla. Nykyään sitä tuetaan käytännössä kaikissa ohjelmointikielissä ja tekstieditoreissa.
Rakennuspalikat
Kirjaimelliset merkit
Yksinkertaisin regex on pelkkää tekstiä. Kaava hello vastaa merkkijonoa "hello" missä tahansa se esiintyy. Ei mitään erikoista.
Piste (.) — mikä tahansa merkki
Piste vastaa mitä tahansa yksittäistä merkkiä paitsi rivinvaihtoa.
h.tvastaa "hat", "hit", "hot", "h3t" ja jopa "h t"
Merkkiluokat ([])
Hakasulkeet määrittelevät joukon sallittuja merkkejä yhdessä kohdassa.
[aeiou]— mikä tahansa vokaali[0-9]— mikä tahansa numero[A-Za-z]— mikä tahansa kirjain[^0-9]— mikä tahansa merkki, joka EI ole numero (^hakasulkeiden sisällä tarkoittaa "ei")
Lyhenneluokat
| Lyhenne | Merkitys | Vastaa |
|---|---|---|
\d |
Mikä tahansa numero | [0-9] |
\w |
Sanamerkki | [A-Za-z0-9_] |
\s |
Välilyönti | [ \t\n\r] |
\D |
Ei numero | [^0-9] |
\W |
Ei sanamerkki | [^A-Za-z0-9_] |
\S |
Ei välilyönti | [^ \t\n\r] |
Kvanttorit — kuinka monta
Kvanttorit ohjaavat, kuinka monta kertaa edeltävän elementin on esiinnyttävä.
| Symboli | Merkitys | Esimerkki | Vastaa |
|---|---|---|---|
* |
Nolla tai enemmän | ab*c |
"ac", "abc", "abbc" |
+ |
Yksi tai enemmän | ab+c |
"abc", "abbc" (ei "ac") |
? |
Nolla tai yksi | colou?r |
"color" ja "colour" |
{3} |
Tasan 3 | \d{3} |
"123", "456" |
{2,4} |
2-4 | \d{2,4} |
"12", "123", "1234" |
Ankkurit — sijainti
^— merkkijonon alku (tai rivin alkum-lipulla)$— merkkijonon loppu (tai rivin loppu)\b— sanan raja
Kaava ^\d{4}$ vastaa merkkijonoa, joka on tasan neljä numeroa, kuten "2026", mutta ei "abc2026" tai "2026xyz".
Ryhmät ja vaihtoehdot
(abc)— kaappaa "abc" ryhmänäa|b— vastaa "a" tai "b"(cat|dog)— vastaa "cat" tai "dog"
Ryhmät mahdollistavat myös kvanttorien soveltamisen sekvensseihin: (ha)+ vastaa "ha", "haha", "hahaha".
Yleisiä käytännön kaavoja
Validoi sähköposti (yksinkertainen)
^[\w.-]+@[\w-]+\.\w{2,}$
Tämä vastaa user@example.com, first.last@company.co.uk (osittain) ja hylkää merkkijonot ilman @-merkkiä tai domainia.
Tärkeää: Sähköpostiosoitteiden täydellinen validointi regexillä on tunnetusti vaikeaa — täydellinen RFC 5322 -spesifikaatio on äärimmäisen monimutkainen. Tuotantojärjestelmissä käytä yksinkertaista regexiä muodon tarkistukseen ja vahvista osoite lähettämällä vahvistussähköposti.
Vastaa puhelinnumeroa
\+?\d{1,3}[-.\s]?\(?\d{1,4}\)?[-.\s]?\d{3,4}[-.\s]?\d{3,4}
Tämä käsittelee muotoja kuten +1 555 123 4567, 555-123-4567 ja (555) 123-4567.
Vastaa URL:ia
https?://[\w.-]+(/[\w./?&=-]*)?
Vastaa https://example.com, http://example.com/path?q=hello.
Vastaa päivämäärää (VVVV-KK-PP)
\d{4}-\d{2}-\d{2}
Vastaa 2026-03-29, 1999-12-31. Huomaa: tämä tarkistaa vain muodon, ei kelvollisuutta — se vastaisi myös 9999-99-99.
Liput, jotka muuttavat toimintaa
Useimmat regex-moottorit tukevat lippuja, jotka muuttavat kaavan soveltamistapaa:
| Lippu | Nimi | Vaikutus |
|---|---|---|
g |
Globaali | Etsi kaikki osumat, ei vain ensimmäistä |
i |
Kirjainkoosta riippumaton | hello vastaa "Hello", "HELLO" jne. |
m |
Monirivinen | ^ ja $ vastaavat jokaisen rivin alkua/loppua |
s |
Dotall | . vastaa myös rivinvaihtomerkkejä |
JavaScriptissa liput lisätään sulkevan kauttaviivan jälkeen: /hello/gi. Pythonissa ne annetaan argumentteina: re.findall(r"hello", text, re.IGNORECASE).
Milloin regex on ylilyöntiä
Regex on tehokas, mutta se ei ole aina oikea työkalu:
- HTML:n tai XML:n jäsentäminen. Käytä oikeaa DOM-jäsennintä. Regex ei voi luotettavasti käsitellä sisäkkäisiä tunnisteita.
- JSON:n jäsentäminen. Käytä
JSON.parse():a tai vastaavaa. Regex epäonnistuu reunatapauksissa. - Monimutkainen validointi. Jos kaavasi ulottuu usealle riville ja sen lukeminen kestää viisi minuuttia, harkitse proseduraalisen validointikoodin kirjoittamista sen sijaan.
- Yksinkertaiset merkkijono-operaatiot. Jos tarvitset vain
startsWith(),includes()taisplit(), tavalliset merkkijonometodit ovat selkeämpiä ja nopeampia.
Yleiset sudenkuopat
- Erikoismerkkien escapoinnin unohtaminen. Piste
.vastaa mitä tahansa merkkiä. Kirjaimellisen pisteen vastaamiseen käytä\.. Sama pätee merkkeihin(,),[,],+,*,?,{,},^,$,|ja\. - Ahne vs. laiska vastaaminen. Oletuksena
.*on ahne — se vastaa niin paljon kuin mahdollista. Lisää?tehdäksesi siitä laiskan:.*?vastaa niin vähän kuin mahdollista. Tämä on tärkeää, kun poimit sisältöä erottimien välistä. - Katastrofaalinen taaksepäinpaluu. Sisäkkäiset kvanttorit kuten
(a+)+voivat saada moottorin kokeilemaan eksponentiaalisen määrän polkuja tietyillä syötteillä, jäädyttäen ohjelmasi. Vältä sisäkkäistä toistoa päällekkäisissä kaavoissa. - Ankkureiden unohtaminen. Ilman
^ja$kaavasi vastaa alimerkkijonoja.\d{3}vastaa "123" merkkijonon "abc12345" sisällä. Käytä^\d{3}$, jos tarvitset tarkan vastaavuuden.
Lue lisää
Paras tapa oppia regexiä on kokeilla. Kirjoita kaava, liitä testiä ja katso mikä valaistuu. Säädä ja toista, kunnes ymmärrät miten kukin osa toimii.
- Kuinka testata Regex-kaavoja — interaktiivinen opas esimerkkeineen
- Regex-testeri — liitä kaavasi ja testidatasi, näe osumat korostettuna reaaliajassa
