Testaa säännöllinen lauseke

testaa säännöllistä lauseketta (regex) tekstillä ja näyttää osumat ja siepatut ryhmät

Mihin säännöllisten lausekkeiden testaajaa tarvitaan?

Regex tester mahdollistaa säännöllisen lausekkeen (regex) tarkistamisen ja varmistamisen, että se vastaa odotettua tekstiä ilman sovelluskoodin suorittamista. Liität lausekkeen, liität syötetekstin, valitset asetukset (flags), ja työkalu näyttää välittömästi luettelon löytyneistä osumista sekä kaapatuista ryhmistä. Se on verkkopohjainen vastine PHP:n preg_match_all()-, JavaScriptin String.matchAll()- tai Pythonin re.findall()-funktioille.

Säännölliset lausekkeet ovat sekä tehokkaita että petollisia. Pilkku, väärin sijoitettu sulku tai ahne kvanttori, joka nielee liikaa merkkejä: ja poimittu merkkijono ei olekaan enää se, mitä odotit. Testaaja välttää edestakaisen liikkeen editorin, terminaalin ja testitiedoston välillä: muokkaat lauseketta, kunnes näet oikean tuloksen.

Miten lauseke kirjoitetaan?

Syötä säännöllinen lauseke ilman erottimia. Ei /.../, ei #...#. Esimerkiksi sähköpostiosoitteiden poimimiseksi tekstistä syötä vain [\w.+-]+@[\w-]+\.[\w.-]+. Valintoja (flags) ohjataan valintaruuduilla.

u-valinta (Unicode) on valittuna oletuksena. Se on lähes aina toivottu: ilman sitä \w ei tunnista aksenttimerkkejä, ja jotkut kuviot palauttavat hiljaisen PCRE-virheen UTF-8-merkkijonoilla.

PCRE-valinnat

  • i (case-insensitive): [a-z] tunnistaa myös isot kirjaimet.
  • m (multiline): ^ ja $ vastaavat jokaisen rivin alkua ja loppua, eivät enää vain koko merkkijonon alkua ja loppua.
  • s (dotall): . tunnistaa myös rivinvaihdot. Hyödyllinen kuvioille, joiden on kuljettava kappaleiden läpi.
  • u (unicode): tulkitsee lausekkeen ja kohteen UTF-8-muodossa. Välttämätön, kun teksti sisältää muita kuin ASCII-merkkejä (aksentit, emojit, ideogrammit).

Esimerkkejä yleisistä säännöllisistä lausekkeista

  • Sähköpostiosoite: [\w.+-]+@[\w-]+\.[\w.-]+ (yksinkertaistettu muoto, riittävä useimpiin käytännön tapauksiin; tiukka RFC 5322 on erittäin monimutkainen).
  • HTTP/HTTPS URL: https?://[\w.-]+(?:/[\w./?%&=-]*)?
  • Ranskalainen puhelinnumero: (?:\+33|0)\s?[1-9](?:[\s.-]?\d{2}){4}
  • Ranskalainen postinumero: \b\d{5}\b
  • ISO-päivämäärä (YYYY-MM-DD): \b\d{4}-\d{2}-\d{2}\b
  • IPv4-osoite: \b(?:\d{1,3}\.){3}\d{1,3}\b
  • Kokonainen sana: \bfoo\b (word boundaries välttävät vastaamasta sanaan football).
  • Hashtag: #\w+
  • Semanttinen versionumero: \d+\.\d+\.\d+(?:-[\w.-]+)?
  • Twitter / X -tunnus: @\w{1,15}

Kaapatut ryhmät

Regex voi sisältää suluissa olevia ryhmiä, jotka eristävät osan osumasta uudelleenkäyttöä varten. Esimerkiksi kuvio (\w+)@(\w+\.\w+) sovellettuna osoitteeseen alice@example.com kaappaa kaksi ryhmää: alice ja example.com. Työkalu näyttää nämä ryhmät omassa sarakkeessaan kunkin osuman vieressä. Myös nimetyt ryhmät ((?P<name>...)) luetellaan nimensä mukaan indeksoituna.

Ryhmittelyyn ilman kaappausta (hyödyllinen kvanttorin soveltamiseen ilman ryhmäluettelon sotkemista) käytetään (?:...)-merkintää.

Suojaus ReDoS-hyökkäyksiä vastaan

PHP:n PCRE-moottori voi joutua katastrofaaliseen takaisinkelaus-tilaan (catastrophic backtracking) tietyillä patologisilla kuvioilla: kuvio kuten (a+)+$ sovellettuna pitkään merkkijonoon, joka koostuu a-merkeistä mutta ei pääty niihin, voi jumiuttaa palvelimen useiksi sekunneiksi. Tämän säännöllisiin lausekkeisiin perustuvan palvelunestohyökkäyksen (ReDoS) välttämiseksi työkalu soveltaa kahta rajoitusta:

  • set_time_limit(2) worker-puolella (käsittely keskeytetään 2 sekunnin kuluttua);
  • pcre.backtrack_limit-asetuksen laskeminen 100 000:een, mikä saa liian monta yhdistelmää tutkivat kuviot epäonnistumaan nopeasti.

Jos kuvio on liian kallis, työkalu näyttää PCRE-virheilmoituksen (preg_last_error_msg()), tyypillisesti Backtrack limit was exhausted. Muotoile kuviosi uudelleen käyttämällä possessiivisia kvanttoreita (a++) tai atomisia ryhmiä ((?>...)) takaisinkelauksen välttämiseksi.

Usein kysytyt kysymykset

Miksi säännöllinen lausekkeeni ei toimi tässä, vaikka se toimii JavaScriptissä?

Tämän työkalun moottori on PCRE (PHP), joka on lähellä Perliä. Syntaksi on hyvin samanlainen kuin JavaScriptissä, mutta jotkin ominaisuudet eroavat toisistaan: vaihtelevan pituiset lookbehibit, tietyt Unicode-aliakset tai oletusarvoinen kirjainkoon hallinta. Jos aiot suorittaa kuvion selaimen puolella, testace se myös JS-ympäristössä.

Miksi \w ei kaappaa aksenttimerkkejä?

Ilman u-valintaa \w tunnistaa vain [A-Za-z0-9_]. u-valinnalla (Unicode) se tunnistaa kaikki UCD-määritelmän mukaiset kirjaimet, mukaan lukien aksenttimerkit. Syvällisempään käyttöön voit käyttää Unicode-luokkia: \p{L} (kirjain), \p{N} (numero), \p{P} (välimerkki).

Säilyttääkö työkalu tekstini?

Ei. Lauseke ja kohde käsitellään PHP-workerin RAM-muistissa ilman tallennusta. Mitään lähetettyjä tietoja ei lokiteta.

Mitä tehdä, jos saan viestin "Backtrack limit was exhausted"?

Kuviosi tekee liikaa takaisinkelausta. Etsi sisäkkäisiä kvanttoreita, kuten (a+)+ tai (\w+)*, jotka ovat tyypillisiä ReDoS-tapauksia. Korvaa ne yksiselitteisellä muodolla: esimerkiksi \w+ sen sijaan, että käyttäisit (\w+)*.

Voinko testata monirivistä kuviota?

Kyllä. Valitse m-vaihtoehto, jotta ^ ja $ tunnistavat jokaisen rivin alun ja lopun. Valitse lisäksi s, jos haluat, että . vastaa myös rivinvaihtoja.

Pyyntöesimerkki

curl -X POST https://cdrn.fr/api/v1/tools/regex-tester/execute \
  -H "Content-Type: application/json" \
  -d '{"pattern":"...","subject":"...","flag_i":false,"flag_m":false,"flag_s":false,"flag_u":true}'

Syöteskeema

Kenttä Tyyppi Pakollinen Oletus
pattern string
subject text
flag_i boolean false
flag_m boolean false
flag_s boolean false
flag_u boolean true

Päätepisteet

  • GET https://cdrn.fr/api/v1/tools - listaa kaikki saatavilla olevat työkalut
  • GET https://cdrn.fr/api/v1/tools/regex-tester - hakee tämän työkalun skeeman
  • POST https://cdrn.fr/api/v1/tools/regex-tester/execute - suorittaa tämän työkalun JSON-payloadilla