Tengo una expresión regular, por ejemplo (ma|(t){1})
. Coincide con ma
y t
y no coincide con bla
.
Quiero negar la expresión regular, por lo tanto, debe coincidir con bla
y no con ma
y t
, agregando algo a esta expresión regular . Sé que puedo escribir bla
, pero la verdadera expresión regular es más compleja.
Use un lookaround negativo: (?!
pattern
)
Las alternativas positivas se pueden usar para afirmar que un patrón coincide. Las vistas negativas son lo opuesto: se usa para afirmar que un patrón NO coincide. Algunos sabores apoyan las aserciones; algunos ponen limitaciones en mirar hacia atrás, etc.
Estos son bashs de encontrar soluciones de expresiones regulares para los problemas de los juguetes como ejercicios; Deben ser educativos si intenta aprender las diversas formas en que puede usar las alternativas (anidarlas, usarlas para capturar, etc.):
Suponiendo que solo quiere rechazar cadenas que coincidan con la expresión regular por completo (es decir, mmbla
está bien, pero mm
no), esto es lo que quiere:
^(?!(?:m{2}|t)$).*$
(?!(?:m{2}|t)$)
es un lookahead negativo; dice “comenzando desde la posición actual, los siguientes caracteres no son mm
o t
, seguidos por el final de la cadena”. El anclaje de inicio ( ^
) al principio asegura que la búsqueda anticipada se aplica al comienzo de la cadena. Si eso tiene éxito, el .*
Sigue adelante y consume la cadena.
FYI, si estás usando el método de matches()
Java, realmente no necesitas el ^
y el $
final, pero no hacen ningún daño. Sin embargo, se requiere $
en la búsqueda anticipada.
\b(?=\w)(?!(ma|(t){1}))\b(\w*)
esto es para la expresión regular dada.
el \ b es para encontrar el límite de palabras.
la mirada positiva hacia adelante (? = \ w) está aquí para evitar espacios.
la mirada negativa hacia adelante sobre la expresión regular original es para evitar coincidencias de la misma.
y finalmente el (\ w *) es atrapar todas las palabras que quedan.
el grupo que contendrá las palabras es el grupo 3.
el patrón simple (?!) no funcionará ya que cualquier subcadena coincidirá
el simple ^ (?! (?: m {2} | t) $). * $ no funcionará ya que su granularidad es líneas completas