Probador de Regex
Prueba expresiones regulares contra un texto y ve todas las coincidencias resaltadas
Patrón
Texto de prueba
¿Qué es una expresión regular?
Una expresión regular (regex o regexp) es una secuencia de caracteres que define un patrón de búsqueda. Los probadores de regex te permiten escribir un patrón, ejecutarlo contra texto de ejemplo y ver todas las coincidencias resaltadas en tiempo real. El concepto se remonta al trabajo del matemático Stephen Kleene sobre lenguajes regulares en los años 50, y Ken Thompson integró el primer motor de regex en el editor de texto QED en 1968.
Un motor de regex lee un patrón de izquierda a derecha, consumiendo caracteres de entrada mientras intenta encontrar coincidencias. Usa backtracking cuando una coincidencia parcial falla: el motor retrocede y prueba rutas alternativas en el patrón. Algunos motores (como RE2, usado en Go) evitan el backtracking por completo convirtiendo los patrones a autómatas finitos deterministas (DFA), lo que garantiza coincidencia en tiempo lineal a cambio de no soportar características como las referencias hacia atrás.
La sintaxis de regex está estandarizada de forma laxa. PCRE (Perl Compatible Regular Expressions) es la variante más común, soportada por PHP, el módulo re de Python y JavaScript con pequeñas diferencias. POSIX define una sintaxis más limitada usada por grep y sed. Las diferencias importan al portar patrones entre lenguajes: un lookahead que funciona en JavaScript puede no compilar en el motor RE2 de Go.
¿Por qué usar un probador de regex online?
Escribir regex en un archivo de código implica guardar, ejecutar e inspeccionar la salida cada vez que ajustas el patrón. Un probador de regex en el navegador reduce ese ciclo de retroalimentación a cero: escribes y ves las coincidencias al instante.
Casos de uso del probador de regex
Referencia rápida de sintaxis regex
La tabla siguiente cubre los tokens regex más utilizados. Funcionan en JavaScript, Python, Go, PHP y la mayoría de los motores compatibles con PCRE. Las extensiones específicas de cada lenguaje (como los patrones condicionales de Python o los grupos con nombre de JavaScript usando la sintaxis \k) están descritas en la sección de ejemplos de código.
| Patrón | Nombre | Descripción |
|---|---|---|
| . | Any character | Matches any single character except newline (unless s flag is set) |
| \d | Digit | Matches [0-9] |
| \w | Word character | Matches [a-zA-Z0-9_] |
| \s | Whitespace | Matches space, tab, newline, carriage return, form feed |
| \b | Word boundary | Matches the position between a word character and a non-word character |
| ^ | Start of string/line | Matches the start of the input; with m flag, matches start of each line |
| $ | End of string/line | Matches the end of the input; with m flag, matches end of each line |
| * | Zero or more | Matches the preceding token 0 or more times (greedy) |
| + | One or more | Matches the preceding token 1 or more times (greedy) |
| ? | Optional | Matches the preceding token 0 or 1 time |
| {n,m} | Quantifier range | Matches the preceding token between n and m times |
| () | Capturing group | Groups tokens and captures the matched text for back-references |
| (?:) | Non-capturing group | Groups tokens without capturing the matched text |
| (?=) | Positive lookahead | Matches a position followed by the given pattern, without consuming it |
| (?<=) | Positive lookbehind | Matches a position preceded by the given pattern, without consuming it |
| [abc] | Character class | Matches any one of the characters inside the brackets |
| [^abc] | Negated class | Matches any character not inside the brackets |
| | | Alternation | Matches the expression before or after the pipe |
Flags de regex explicados
Los flags (también llamados modificadores) cambian cómo el motor procesa el patrón. En JavaScript se añaden después de la barra de cierre: /pattern/gi. En Python se pasan como segundo argumento: re.findall(pattern, text, re.IGNORECASE | re.MULTILINE). No todos los flags están disponibles en todos los lenguajes.
| Flag | Nombre | Comportamiento |
|---|---|---|
| g | Global | Find all matches, not just the first one |
| i | Case-insensitive | Letters match both uppercase and lowercase |
| m | Multiline | ^ and $ match start/end of each line, not just the whole string |
| s | Dot-all | . matches newline characters as well |
| u | Unicode | Treat the pattern and subject as a Unicode string; enables \u{FFFF} syntax |
| y | Sticky | Matches only from the lastIndex position in the target string |
Ejemplos de código
Ejemplos de regex funcionales en JavaScript, Python, Go y la línea de comandos. Cada ejemplo muestra la construcción del patrón, la extracción de coincidencias y la salida.
// 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"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']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]
}# 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