Tema 14 · Lookaround

Aserciones Lookaround: Lookahead (?=, ?!) y Lookbehind (?<=, ?<!)

Inspecciona lo que viene antes o después sin consumir caracteres ni alterar el cursor: lookahead positivo y negativo, y lookbehind positivo y negativo.

¿Qué son las Aserciones Lookaround?

Las aserciones Lookaround (mirar alrededor) son una de las características más sofisticadas del motor PCRE. Son comprobaciones de longitud cero (Zero-Width): inspeccionan el texto adyacente para verificar una condición, pero no consumen ningún carácter ni avanzan el cursor de coincidencia.

Permiten responder preguntas como: "Quiero extraer un número, pero únicamente si está inmediatamente seguido de la palabra 'USD'" o "Quiero capturar una palabra, pero solo si NO tiene un signo '$' antes".

Infografía: Los Cuatro Tipos de Lookaround en PCRE

Aserciones Lookaround en PCRE

Figura 14.1: Inspecciones hacia adelante (Lookahead) y hacia atrás (Lookbehind) con lógica positiva y negativa.

Tabla de Referencia Rápida

Aserción Sintaxis Significado en Español Ejemplo
Lookahead Positivo (?=patrón) Seguido por... /\d+(?=\s*px)/ coincide con 24 en "24px" (sin incluir 'px').
Lookahead Negativo (?!patrón) NO seguido por... /\d+(?!\s*px)/ coincide con 24 en "24rem", pero no en "24px".
Lookbehind Positivo (?<=patrón) Precedido por... /(?<=\$)\d+/ coincide con 50 en "$50" (sin incluir el '$').
Lookbehind Negativo (?<!patrón) NO precedido por... /(?<!\$)\d+/ coincide con números que no tengan signo de dólar delante.
💡
Regla Clave del Lookbehind en PCRE

El patrón dentro de un lookbehind (?<=...) debe tener una longitud fija o finita en la mayoría de implementaciones (no se permiten cuantificadores ilimitados como .* o .+ dentro de un lookbehind).

⚡ Extracción de Importes Financieros con Lookbehind y Lookahead

Ejemplo interactivo. Extraemos únicamente los valores numéricos limpios utilizando aserciones que inspeccionan los símbolos adyacentes sin consumirlos:

lookaround_financiero.php
Solo lectura
<?php
$informe = <<<TEXTO
Transacciones del día:
- Cobro de suscripción: $149.00 facturado con éxito.
- Reembolso de garantía: EUR 45.00 acreditado.
- Bono promocional: $500.00 aplicado a cuenta.
- Identificador de registro interno: #149 no es un precio.
TEXTO;

// 1. Lookbehind Positivo: busca números decimales precedidos exactamente por '$'
// El signo '$' se evalúa pero NO forma parte del resultado capturado
$patronPreciosUSD = '/(?<=\$)\d+(?:\.\d{2})?/';

// 2. Lookahead Positivo: busca palabras que terminen antes de "facturado"
$patronEstado = '/\b[a-zA-Záéíóúñ]+\b(?=\s+facturado)/iu';

echo "<div style='font-family:system-ui; max-width:640px; padding:15px;'>";
echo "<h3 style='color:#0f172a; margin-top:0;'>👁️ Aserciones Lookaround en Acción</h3>";

// Extracción 1
preg_match_all($patronPreciosUSD, $informe, $precios);
echo "<div style='background:#ecfdf5; border:1px solid #10b981; border-radius:8px; padding:12px; margin-bottom:12px;'>";
echo "  <strong style='color:#065f46;'>1. Precios en USD extraídos con Lookbehind (?&lt;=\\$):</strong><br>";
echo "  <span style='color:#64748b; font-size:12px;'>Extrae el valor numérico puro sin el símbolo de moneda:</span>";
echo "  <div style='margin-top:6px;'>";
foreach ($precios[0] as $precio) {
    echo "    <span style='background:#ffffff; color:#047857; font-family:monospace; font-weight:bold; padding:3px 8px; border-radius:4px; margin-right:6px;'>$precio</span>";
}
echo "  </div>";
echo "</div>";

// Extracción 2
preg_match($patronEstado, $informe, $accion);
echo "<div style='background:#f0f9ff; border:1px solid #0284c7; border-radius:8px; padding:12px;'>";
echo "  <strong style='color:#0369a1;'>2. Acción previa con Lookahead (?=\\s+facturado):</strong><br>";
echo "  <span style='color:#64748b; font-size:12px;'>Palabra inmediatamente anterior a 'facturado':</span><br>";
echo "  <code style='background:#ffffff; color:#0284c7; font-weight:bold; padding:4px 8px; border-radius:4px; display:inline-block; margin-top:4px;'>" . ($accion[0] ?? 'No encontrado') . "</code>";
echo "</div>";

echo "</div>";
Pruébalo tú mismo » Se abre en una nueva pestaña con ejecución en vivo
🧠
Mini-Quiz de Retención
Comprueba tu comprensión antes de pasar a la siguiente lección
1 Pregunta
Pregunta 1
¿Qué significa técnicamente que una aserción Lookaround sea de "longitud cero" (Zero-Width)?
🦉
¿Tienes dudas con este tema?
Sócrates AI puede darte analogías y explicarte este código paso a paso.

🚀 ¿Quieres dominar Regex en PHP: Expresiones Regulares & PCRE y crear proyectos reales?

Aprende arquitectura limpia, desarrollo web moderno, buenas prácticas y despliegue en producción con nuestro Bootcamp Fullstack Developer con mentorías en vivo.

🏛️ Autoría y Propiedad Intelectual: Obra educativa original de David Amador para Kilopolis Academia (Solucionáticos), estructurada sobre las especificaciones y estándares abiertos del W3C, el estándar vivo de WHATWG y la documentación oficial de código abierto. © Todos los derechos reservados.