Expresión regular - Selección y ramificación
1. ¿Qué es la selección (Alternation)?
La selección (Alternation) se refiere al uso en expresiones regulares del|símbolo que representa la relación lógica "o". Te permite hacer coincidir con uno de varios patrones posibles.
cat|dog
Este patrón coincidirá con "cat" o "dog".
2. ¿Qué es la ramificación (Branching)?
La ramificación se refiere a que, cuando el motor de expresiones regulares encuentra un punto de selección durante el proceso de coincidencia, intenta diferentes rutas de coincidencia. Cuando una ruta falla, el motor retrocede e intenta otras rutas posibles.
Análisis del principio
Operador de selección|Principio de funcionamiento
- El motor de expresiones regulares escanea de izquierda a derecha
|las distintas opciones separadas por | - Intenta hacer coincidir la primera opción; si tiene éxito, se detiene.
- Si la primera opción no coincide, intenta con la segunda opción.
- Y así sucesivamente, hasta encontrar una coincidencia o agotar todas las opciones.
Agrupación y selección
La selección generalmente se combina con la agrupación()para limitar el alcance de la selección:
Ejemplo
Este patrón coincidirá con "gray" o "grey".
Mecanismo de retroceso (backtracking) de ramificación
Cuando el motor de expresiones regulares encuentra un punto de selección:
- Recuerda la posición actual (crea un punto de control)
- Intenta con la primera rama
- Si falla, retrocede al punto de control
- Intenta con la siguiente rama
- Repite hasta que tenga éxito o se hayan probado todas las ramas.
Ejemplos prácticos
Ejemplo básico de selección
Ejemplo
const datePattern = /\b(January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}, \d{4}\b/;
console.log(datePattern.test("March 15, 2023")); // true
console.log(datePattern.test("Sept 10, 2022")); // false (la abreviatura no coincide)
Ejemplo de selección con agrupación
Ejemplo
# Coincidir con la ortografía americana o británica
pattern = r"colou?r|color"
text = "The color is red and the colour is blue"
matches = re.findall(pattern, text)
print(matches) # Salida: ['color', 'colour']
Ejemplo de ramificación compleja
Ejemplo
String phonePattern = "(\\(\\d{3}\\) ?|\\d{3}[-.]?)\\d{3}[-.]?\\d{4}";
String[] testNumbers = {
"(123)456-7890",
"123.456.7890",
"123-456-7890",
"1234567890"
};
for (String number : testNumbers) {
System.out.println(number.matches(phonePattern)); // Todo imprime true
}
Aplicaciones extendidas
Consejos de optimización del rendimiento
Colocar las opciones de alta frecuencia al frente: coloca las opciones con mayor probabilidad de coincidencia al principio.
(common|uncommon|rare) # 优化顺序
Evita ramas redundantes:
(a|ab|c) # 不好 (ab?|c) # 更好
Usa grupos sin captura: cuando no sea necesario capturar grupos.
(?:pattern1|pattern2)
Escenarios de aplicación práctica
- Análisis de logs: coincide con varios formatos de mensajes de error.
- Validación de formularios: acepta varios formatos de entrada válidos.
- Procesamiento de texto: busca sinónimos o variantes ortográficas.
- Coincidencia de rutas: enrutamiento de URL en frameworks web.