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

  1. El motor de expresiones regulares escanea de izquierda a derecha|las distintas opciones separadas por |
  2. Intenta hacer coincidir la primera opción; si tiene éxito, se detiene.
  3. Si la primera opción no coincide, intenta con la segunda opción.
  4. 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

gr(a|e)y

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:

  1. Recuerda la posición actual (crea un punto de control)
  2. Intenta con la primera rama
  3. Si falla, retrocede al punto de control
  4. Intenta con la siguiente rama
  5. Repite hasta que tenga éxito o se hayan probado todas las ramas.

Ejemplos prácticos

Ejemplo básico de selección

Ejemplo

// Coincidir con varios formatos de fecha
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

import re

# 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

// Coincidir con varios formatos de número de teléfono
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

  1. Colocar las opciones de alta frecuencia al frente: coloca las opciones con mayor probabilidad de coincidencia al principio.

    (common|uncommon|rare)  # 优化顺序
  2. Evita ramas redundantes:

    (a|ab|c)  # 不好
    (ab?|c)   # 更好
  3. Usa grupos sin captura: cuando no sea necesario capturar grupos.

    (?:pattern1|pattern2)

Escenarios de aplicación práctica

  1. Análisis de logs: coincide con varios formatos de mensajes de error.
  2. Validación de formularios: acepta varios formatos de entrada válidos.
  3. Procesamiento de texto: busca sinónimos o variantes ortográficas.
  4. Coincidencia de rutas: enrutamiento de URL en frameworks web.
Otras extensiones