Test et regulært udtryk

tester et regulært udtryk (regex) på en tekst og viser matches og fangede grupper

Hvad bruges en regulært udtrykstester til?

En regex-tester giver dig mulighed for at kontrollere, at et regulært udtryksmønster (regex) matcher til den forventede tekst uden at skulle starte applikationskoden. Vi indsætter mønsteret, vi indsætter inputteksten, vi tjek indstillingerne (flag), og værktøjet viser straks listen over fundne match samt de tilfangetagne grupper. Dette er online-ækvivalenten til preg_match_all() i PHP, fra String.matchAll() i JavaScript eller re.findall() i Python.

Regexes er både kraftfulde og vanskelige. Et komma, en malplaceret parentes, en kvantifier fråser, der suger for mange karakterer til sig: og den udtrukne streng er ikke længere, hvad vi forventede. Testeren undgår rundturen med en editor, en terminal og en testfil: vi itererer mønsteret, indtil vi ser godt resultat.

Hvordan skriver man mønsteret?

Indtast regex uden skilletegn. Ingen /.../, ingen #...#. For eksempel, for at fange e-mail-adresser fra tekst, skal du bare indtaste [\w.+-]+@[\w-]+\.[\w.-]+. Indstillinger (flag) styres af afkrydsningsfelter.

Indstillingen u (Unicode) er markeret som standard. Det er næsten altid ønsket: uden det, \w genkender ikke accenter, og nogle mønstre returnerer en tavs PCRE-fejl på UTF-8 strenge.

PCRE muligheder

  • i (uafhængig af store og små bogstaver): [a-z] genkender også store bogstaver.
  • m (multilin): ^ og $ matcher begyndelsen og slutningen af hver linje plus kun starten og slutningen af den overordnede streng.
  • s (dotall): . genkender også linjeskift. Nyttigt til mønstre som skal krydse afsnit.
  • u (unicode): fortolker mønsteret og emnet i UTF-8. Vigtigt så snart teksten indeholder ikke-ASCII-tegn (accenter, emoji, ideogrammer).

Almindelige Regex-eksempler

  • E-mailadresse: [\w.+-]+@[\w-]+\.[\w.-]+ (forenklet form, tilstrækkelig til mest praktiske tilfælde; strenge RFC 5322 er meget kompleks).
  • HTTP/HTTPS URL: https?://[\w.-]+(?:/[\w./?%&=-]*)?
  • Fransk telefonnummer: (?:\+33|0)\s?[1-9](?:[\s.-]?\d{2}){4}
  • Fransk postnummer: \d{5}
  • ISO-dato (ÅÅÅÅ-MM-DD): \d{4}-\d{2}-\d{2}
  • IPv4-adresse: (?:\d{1,3}\.){3}\d{1,3}
  • Hele ord: foo (ordgrænserne undgår at matche fodbold).
  • Hashtag: #\w+
  • Semantisk versionsnummer: \d+\.\d+\.\d+(?:-[\w.-]+)?
  • Twitter ID / X: @\w{1,15}

Fangede grupper

Et regex kan indeholde grupper i parentes, som isolerer en del af matchningen til genbrug. For eksempel fanger mønsteret (\w+)@(\w+\.\w+) anvendt på alice@example.com to grupper: alice og example.com. Værktøjet viser disse grupper i en kolonne dedikeret, ved siden af hver kamp. Navngivne grupper ((?P...)) er også opført, indekseret efter navn.

For at gruppere uden at fange (nyttigt til at anvende en kvantifier uden at forurene listen over grupper), vi bruger (?:...).

Beskyttelse mod ReDoS

PHP's PCRE-motor kan gå ind i katastrofisk tilbagesporing af visse patologiske årsager: et mønster som (a+)+$ anvendt på en lang uafsluttet a-streng kan blokere serveren i flere sekunder. For at undgå dette denial-of-service-udtryk (ReDoS), værktøjet anvender to grænser:

  • en set_time_limit(2) på arbejdersiden (behandling afbrydes efter 2 sekunder);
  • reducerer pcre.backtrack_limit til 100.000, hvilket får mønstre til at fejle hurtigt der udforsker for mange kombinationer.

I tilfælde af for dyre årsager viser værktøjet PCRE-fejlmeddelelsen (preg_last_error_msg()), typisk Backtrack-grænsen var opbrugt. Omformuler din mønster ved hjælp af besiddende kvantifiers (a++) eller atomgrupper ((?>...)) for at undgå tilbagesporing.

Ofte stillede spørgsmål

Hvorfor matcher mit regex ikke, selvom det virker i JavaScript?

Motoren til dette værktøj er PCRE (PHP), tæt på Perl. Syntaksen minder meget om JavaScript men nogle funktioner er forskellige: lookbehinds af variabel længde, visse aliaser Unicode eller standardhåndteringen af store og små bogstaver. Hvis du planlægger at køre mønstersiden browser, test også i et JS-miljø.

Hvorfor fanger mine \w ikke accenter?

Uden u-flaget genkender \w kun [A-Za-z0-9_]. Med u (Unicode), den genkender alle bogstaver i UCD-forstand, inklusive accenttegn. For at gå videre, brug Unicode-klasser: \p{L} (bogstav), \p{N} (tal), \p{P} (tegnsætning).

Bevarer værktøjet min tekst?

Nej. Mønsteret og emnet behandles i RAM af PHP-arbejderen uden vedholdenhed. Ingen data indsendt er ikke logget.

Hvad skal jeg gøre, hvis jeg modtager meddelelsen "Backtrack-grænsen var opbrugt"?

Dit mønster går for meget frem og tilbage. Se efter indlejrede kvantifikatorer af typen (a+)+ eller (\w+)*, som er typiske tilfælde af ReDoS. Udskift dem med en utvetydig form: for eksempel \w+ i stedet for (\w+)*.

Kan jeg teste et flerlinjemønster?

Ja. Marker indstillingen m, så ^ og $ genkender begyndelsen og enderne af hver linje. Markér desuden s, hvis du ønsker at . skal krydse linjeskift.

Anmodningseksempel

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}'

Inputskema

Felt Type Påkrævet Standard
pattern string
subject text
flag_i boolean false
flag_m boolean false
flag_s boolean false
flag_u boolean true

Endpoints

  • GET https://cdrn.fr/api/v1/tools - lister alle tilgængelige værktøjer
  • GET https://cdrn.fr/api/v1/tools/regex-tester - henter skemaet for dette værktøj
  • POST https://cdrn.fr/api/v1/tools/regex-tester/execute - udfører dette værktøj med et JSON-payload