Tengo una expresión regular, por ejemplo (ma|(t){1})
. Coincide ma
y t
no coincide bla
.
Quiero negar la expresión regular, por lo tanto, debe coincidir bla
y no ma
y t
, agregando algo a esta expresión regular . Sé que puedo escribir bla
, sin embargo, la expresión regular real es más compleja.
regex
regex-negation
IAdapter
fuente
fuente
{1}
es completamente inútil. (Si cree que proporciona algún valor, ¿por qué no escribe((m{1}a{1}){1}|(t){1}){1}
?)Respuestas:
Utilice una mirada negativa:
(?!
pattern
)
Se pueden utilizar revisiones positivas para afirmar que un patrón coincide. La búsqueda negativa es lo contrario: se usa para afirmar que un patrón NO coincide. Algún sabor apoya afirmaciones; algunos ponen limitaciones en mirar atrás, etc.
Enlaces a regular-expressions.info
Ver también
Más ejemplos
Estos son intentos de encontrar soluciones de expresiones regulares a problemas de juguetes como ejercicios; Deben ser educativos si está tratando de aprender las diversas formas en que puede usar los métodos alternativos (anidarlos, usarlos para capturar, etc.):
fuente
grep
.Pattern.compile("(?!(a.*b))").matcher("xab").matches()
debería sertrue
, ¿verdad?Suponiendo que solo desea rechazar cadenas que coincidan con la expresión regular por completo (es decir,
mmbla
está bien, peromm
no lo está), esto es lo que desea:(?!(?:m{2}|t)$)
es un negativo mirada hacia el futuro ; dice "a partir de la posición actual, los siguientes caracteres no sonmm
ot
, seguidos del final de la cadena". El ancla de inicio (^
) al principio garantiza que la búsqueda anticipada se aplique al principio de la cadena. Si tiene éxito,.*
sigue adelante y consume la cuerda.FYI, si está utilizando el
matches()
método de Java , realmente no necesita el^
y el final$
, pero no hacen ningún daño. Sin$
embargo, se requiere el interior de la anticipación.fuente
.*
al final de su expresión regular, de lo contrario rechazará todas las cadenas.$
interior del avance negativo y.*
el final son ambos bits críticos. Como siempre ocurre con los RE, un conjunto sólido de pruebas unitarias es absolutamente fundamental para hacerlo bien. Esta respuesta es 100% correcta.esto es para la expresión regular dada.
la \ b es 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.
y finalmente el (\ w *) es capturar todas las palabras que quedan.
el grupo que contendrá las palabras es el grupo 3.
el simple (?! patrón) no funcionará ya que cualquier subcadena coincidirá con
el simple ^ (?! (?: m {2} | t) $). * $ will no funciona ya que su granularidad es líneas completas
fuente