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
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:
<?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 (?<=\\$):</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>";
Mini-Quiz de Retención
Comprueba tu comprensión antes de pasar a la siguiente lección¿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.