Testeur Regex

Testez des expressions régulières sur une chaîne et visualisez toutes les correspondances surlignées

Essayer un exemple

Motif

//g

Chaîne de test

Fonctionne localement · Sûr pour coller des secrets

Qu'est-ce qu'une expression régulière ?

Une expression régulière (regex ou regexp) est une séquence de caractères qui définit un motif de recherche. Les testeurs de regex permettent d'écrire un motif, de l'exécuter sur un texte d'exemple et de voir toutes les correspondances surlignées en temps réel. Le concept remonte aux travaux du mathématicien Stephen Kleene sur les langages réguliers dans les années 1950, et Ken Thompson a intégré le premier moteur regex dans l'éditeur de texte QED en 1968.

Un moteur regex lit un motif de gauche à droite en consommant les caractères de l'entrée au fil de la recherche. Il utilise le backtracking lorsqu'une correspondance partielle échoue : le moteur recule et essaie des chemins alternatifs dans le motif. Certains moteurs (comme RE2 utilisé dans Go) évitent complètement le backtracking en convertissant les motifs en automates finis déterministes (DFA), ce qui garantit une correspondance en temps linéaire au prix de l'absence de fonctionnalités comme les références arrières.

La syntaxe regex est standardisée de manière souple. PCRE (Perl Compatible Regular Expressions) est la variante la plus répandue, supportée par PHP, le module re de Python et JavaScript avec de légères différences. POSIX définit une syntaxe plus limitée utilisée par grep et sed. Ces différences ont leur importance lors du portage de motifs entre langages : un lookahead qui fonctionne en JavaScript peut ne pas compiler du tout dans le moteur RE2 de Go.

Pourquoi utiliser un testeur de regex en ligne ?

Écrire une regex dans un fichier de code implique de sauvegarder, exécuter et inspecter le résultat à chaque ajustement du motif. Un testeur de regex dans le navigateur réduit cette boucle de retour à zéro : vous tapez, vous voyez les correspondances.

Surlignage des correspondances en temps réel
Chaque frappe met à jour les résultats instantanément. Vous voyez quelles parties du texte correspondent, quels groupes capturants sont renseignés, et exactement où chaque correspondance commence et se termine. Aucun cycle compiler-exécuter-déboguer.
🔒
Traitement axé sur la confidentialité
La correspondance de motifs s'exécute dans votre navigateur via le moteur JavaScript RegExp. Aucun texte ni motif n'est envoyé à un serveur. C'est important lorsque vous testez sur des fichiers de logs, des données clients ou des réponses d'API contenant des informations sensibles.
🔍
Inspection visuelle des correspondances
Les correspondances sont surlignées directement dans le texte avec leurs positions et les valeurs des groupes capturants affichées. La visualisation des correspondances facilite la détection des erreurs de décalage dans les quantifieurs ou des ancres manquantes.
🌐
Aucune connexion ni installation requise
Fonctionne sur n'importe quel appareil avec un navigateur moderne. Pas de compte, pas d'extension, pas de plugin IDE. Ouvrez la page, collez votre motif et votre texte, et commencez à tester.

Cas d'usage du testeur de regex

Validation des saisies frontend
Construisez et vérifiez des motifs pour les champs d'e-mail, de numéro de téléphone ou de carte bancaire avant de les intégrer dans les attributs pattern d'HTML5 ou la logique de validation JavaScript.
Analyse de logs backend
Écrivez des motifs regex pour extraire des horodatages, des codes d'erreur ou des adresses IP depuis les logs d'application. Testez sur de vrais échantillons de logs pour confirmer que le motif capture les bons groupes.
DevOps & Infrastructure
Déboguez les regex utilisées dans les blocs location Nginx, les règles de réécriture Apache, ou les règles d'alerte Prometheus. Un mauvais motif dans une configuration serveur peut casser le routage ou rater des alertes.
QA & Automatisation des tests
Vérifiez que les corps de réponse ou les sorties HTML correspondent aux motifs attendus dans les assertions de tests end-to-end. Pré-testez la regex ici avant de la commiter dans votre suite de tests.
Pipelines d'extraction de données
Prototypez des motifs pour extraire des champs structurés depuis du texte non structuré : scraping de prix de produits, traitement des cas limites de CSV, ou extraction de métadonnées depuis des en-têtes d'e-mails.
Apprentissage des expressions régulières
Expérimentez avec les métacaractères, les quantifieurs et les groupes sur des chaînes d'exemple. Le retour visuel immédiat rend la syntaxe regex plus facile à apprendre qu'en lisant la documentation seule.

Référence rapide de la syntaxe regex

Le tableau ci-dessous couvre les tokens regex les plus utilisés. Ils fonctionnent en JavaScript, Python, Go, PHP et la plupart des moteurs compatibles PCRE. Les extensions spécifiques à chaque langage (comme les motifs conditionnels de Python ou les groupes nommés de JavaScript avec la syntaxe \k) sont mentionnées dans la section des exemples de code.

MotifNomDescription
.Any characterMatches any single character except newline (unless s flag is set)
\dDigitMatches [0-9]
\wWord characterMatches [a-zA-Z0-9_]
\sWhitespaceMatches space, tab, newline, carriage return, form feed
\bWord boundaryMatches the position between a word character and a non-word character
^Start of string/lineMatches the start of the input; with m flag, matches start of each line
$End of string/lineMatches the end of the input; with m flag, matches end of each line
*Zero or moreMatches the preceding token 0 or more times (greedy)
+One or moreMatches the preceding token 1 or more times (greedy)
?OptionalMatches the preceding token 0 or 1 time
{n,m}Quantifier rangeMatches the preceding token between n and m times
()Capturing groupGroups tokens and captures the matched text for back-references
(?:)Non-capturing groupGroups tokens without capturing the matched text
(?=)Positive lookaheadMatches a position followed by the given pattern, without consuming it
(?<=)Positive lookbehindMatches a position preceded by the given pattern, without consuming it
[abc]Character classMatches any one of the characters inside the brackets
[^abc]Negated classMatches any character not inside the brackets
|AlternationMatches the expression before or after the pipe

Les drapeaux regex expliqués

Les drapeaux (aussi appelés modificateurs) changent la façon dont le moteur traite le motif. En JavaScript, vous les ajoutez après le slash de fermeture : /pattern/gi. En Python, vous les passez en second argument : re.findall(pattern, text, re.IGNORECASE | re.MULTILINE). Tous les drapeaux ne sont pas disponibles dans chaque langage.

DrapeauNomComportement
gGlobalFind all matches, not just the first one
iCase-insensitiveLetters match both uppercase and lowercase
mMultiline^ and $ match start/end of each line, not just the whole string
sDot-all. matches newline characters as well
uUnicodeTreat the pattern and subject as a Unicode string; enables \u{FFFF} syntax
yStickyMatches only from the lastIndex position in the target string

Exemples de code

Exemples de regex fonctionnels en JavaScript, Python, Go et en ligne de commande. Chaque exemple illustre la construction du motif, l'extraction des correspondances et la sortie.

JavaScript
// Match all email addresses in a string
const text = 'Contact us at support@example.com or sales@example.com'
const emailRegex = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g

const matches = text.matchAll(emailRegex)
for (const match of matches) {
  console.log(match[0], 'at index', match.index)
}
// → "support@example.com" at index 14
// → "sales@example.com" at index 37

// Named capture groups (ES2018+)
const dateRegex = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/
const result = '2026-03-30'.match(dateRegex)
console.log(result.groups)
// → { year: "2026", month: "03", day: "30" }

// Replace with a callback
'hello world'.replace(/\b\w/g, c => c.toUpperCase())
// → "Hello World"
Python
import re

# Find all IPv4 addresses
text = 'Server 192.168.1.1 responded, fallback to 10.0.0.255'
pattern = r'\b(?:\d{1,3}\.){3}\d{1,3}\b'

matches = re.findall(pattern, text)
print(matches)  # → ['192.168.1.1', '10.0.0.255']

# Named groups and match objects
date_pattern = r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})'
m = re.search(date_pattern, 'Released on 2026-03-30')
if m:
    print(m.group('year'))   # → '2026'
    print(m.group('month'))  # → '03'

# Compile for repeated use (faster in loops)
compiled = re.compile(r'\b[A-Z][a-z]+\b')
words = compiled.findall('Hello World Foo bar')
print(words)  # → ['Hello', 'World', 'Foo']
Go
package main

import (
	"fmt"
	"regexp"
)

func main() {
	// Find all matches
	re := regexp.MustCompile(`\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}\b`)
	text := "Contact support@example.com or sales@example.com"
	matches := re.FindAllString(text, -1)
	fmt.Println(matches)
	// → [support@example.com sales@example.com]

	// Named capture groups
	dateRe := regexp.MustCompile(`(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})`)
	match := dateRe.FindStringSubmatch("2026-03-30")
	for i, name := range dateRe.SubexpNames() {
		if name != "" {
			fmt.Printf("%s: %s\n", name, match[i])
		}
	}
	// → year: 2026
	// → month: 03
	// → day: 30

	// Replace with a function
	result := re.ReplaceAllStringFunc(text, func(s string) string {
		return "[REDACTED]"
	})
	fmt.Println(result)
	// → Contact [REDACTED] or [REDACTED]
}
CLI (grep / sed)
# Find lines matching an IP address pattern
grep -E '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b' access.log

# Extract email addresses from a file
grep -oE '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' contacts.txt

# Replace dates from YYYY-MM-DD to DD/MM/YYYY using sed
echo "2026-03-30" | sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/'
# → 30/03/2026

# Count matches per file in a directory
grep -rcE 'TODO|FIXME|HACK' src/
# → src/main.js:3
# → src/utils.js:1

Questions fréquentes

Quelle est la différence entre les regex et les motifs glob ?
Les motifs glob (comme *.txt ou src/**/*.js) sont une syntaxe de caractères génériques simplifiée utilisée pour la correspondance de chemins de fichiers dans les shells et les outils de build. Ils supportent * (n'importe quels caractères), ? (un caractère) et [] (classes de caractères), mais ne disposent pas de quantifieurs, de groupes, de lookaheads ou d'alternatives. Les regex sont bien plus expressives et opèrent sur du texte quelconque, pas seulement des chemins de fichiers. Un motif glob *.json est à peu près équivalent à la regex ^.*\.json$.
Comment faire correspondre un point ou un crochet littéral en regex ?
Préfixez le caractère avec un backslash : \. correspond à un point littéral, \[ correspond à un crochet littéral. Dans une classe de caractères [], un point est déjà littéral et n'a pas besoin d'être échappé. Une erreur courante est d'écrire 192.168.1.1 sans échapper les points, ce qui correspond aussi à 192x168y1z1 car . signifie « n'importe quel caractère ».
Mes données de test sont-elles envoyées à un serveur ?
Non. Cet outil exécute la correspondance regex entièrement dans votre navigateur via le moteur JavaScript RegExp. Aucune requête réseau n'est effectuée avec votre texte ou votre motif. Vous pouvez le vérifier en ouvrant l'onglet Réseau des DevTools de votre navigateur pendant l'utilisation de l'outil.
Pourquoi ma regex fonctionne en JavaScript mais échoue en Python ?
JavaScript et Python utilisent des moteurs regex différents avec des jeux de fonctionnalités légèrement différents. JavaScript supporte \d, les lookaheads (?=) et les lookbehinds (?<=) depuis ES2018, mais ne supporte pas les motifs conditionnels, les groupes atomiques ou les quantifieurs possessifs. Le module re de Python ne supporte pas les classes de propriétés Unicode \p{} (utilisez le module tiers regex à la place). Testez toujours dans le moteur du langage cible ou consultez sa documentation regex.
Qu'est-ce qui provoque le backtracking catastrophique dans une regex ?
Le backtracking catastrophique se produit quand un motif possède des quantifieurs imbriqués qui créent un nombre exponentiel de chemins de correspondance. L'exemple classique est (a+)+ appliqué à une chaîne de a suivi d'un caractère non correspondant. Le moteur essaie toutes les façons possibles de répartir les a entre les groupes interne et externe avant d'échouer. Pour y remédier, utilisez des groupes atomiques (?>), des quantifieurs possessifs a++, ou réécrivez le motif pour éviter les répétitions ambiguës.
Puis-je utiliser une regex pour parser du HTML ?
Une regex peut extraire des valeurs simples depuis des fragments HTML, comme récupérer le href d'une balise <a> unique. Pour parser du HTML complet, utilisez un parser dédié (DOMParser en JavaScript, BeautifulSoup en Python, ou html/template en Go). HTML est une grammaire hors-contexte, et les regex gèrent les grammaires régulières. Les balises imbriquées, les attributs optionnels et les éléments auto-fermants créent des motifs que les regex ne peuvent pas gérer de manière fiable.
Quelle est la différence entre les quantifieurs greedy et lazy ?
Un quantifieur greedy (* ou +) correspond à autant de caractères que possible, puis effectue un backtracking si le reste du motif échoue. Un quantifieur lazy (*? ou +?) correspond à aussi peu de caractères que possible, en s'étendant seulement si nécessaire. Pour l'entrée <b>one</b><b>two</b>, le motif greedy <b>.*</b> correspond à toute la chaîne du premier <b> au dernier </b>, tandis que le motif lazy <b>.*?</b> correspond séparément à <b>one</b> et <b>two</b>.