Con expresiones regulares en Java, quiero escribir una expresión regular que coincida si y solo si el patrón no está precedido por ciertos caracteres. Por ejemplo:
String s = "foobar barbar beachbar crowbar bar ";Quiero hacer coincidir si la barra no está precedida por foo. Entonces la salida sería:
barbar beachbar crowbar barDesea usar negative lookbehind de esta manera:
\w*(?<!foo)bar Donde (?<!x) significa "solo si no tiene "x" antes de este punto".
Consulte Expresiones regulares - Lookaround para obtener más información.
Editar : agregó \w* para capturar los caracteres anteriores (por ejemplo, "playa").
Otra opción es hacer coincidir primero los caracteres de palabras opcionales seguidos de bar , y cuando haya coincidido, verifique que lo que está directamente a la izquierda no sea foobar .
La aserción lookbehind se ejecutará después de hacer coincidir la bar primero.
\w*(?<!foo)bar\w* Coincide con 0+ caracteres de palabra
bar Match literalmente
(?<!foobar) Negativo mirar atrás, afirmar desde la posición actual foobar no está directamente a la izquierda.
En algunos casos, podría ser más fácil incluir opcionalmente la parte anterior y luego omitir esas coincidencias en un segundo paso. Por ejemplo, para encontrar números que no comiencen con un "+":
if (preg_match_all('/(\+?[0-9][0-9\s\-].*[0-9])/s',$text,$matches)) { foreach($matches[1] as $match) { if(substr($match,0,1) == '+'){ continue; } // continue processing } }La mirada negativa detrás no funcionó, ya que aún coincidiría con más de 2 dígitos, pero no incluiría el primer dígito en la coincidencia. Por ejemplo, +1234 se devolvería como 234.