¿Cómo negar toda la expresión regular?

95

Tengo una expresión regular, por ejemplo (ma|(t){1}). Coincide may tno coincide bla.

Quiero negar la expresión regular, por lo tanto, debe coincidir blay no may t, agregando algo a esta expresión regular . Sé que puedo escribir bla, sin embargo, la expresión regular real es más compleja.

IAdapter
fuente
5
Como acotación al margen, {1}es completamente inútil. (Si cree que proporciona algún valor, ¿por qué no escribe ((m{1}a{1}){1}|(t){1}){1}?)
tripleee

Respuestas:

100

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.):

poligenelubricantes
fuente
2
regular-expressions.info es un recurso muy bueno para todo lo relacionado con las expresiones regulares.
Freiheit
¿Qué tienen todos los soportes de búsqueda ? No funciona con grep.
Lazer
Pattern.compile("(?!(a.*b))").matcher("xab").matches()debería ser true, ¿verdad?
Karl Richter
4
Parece que esto no está bien, consulte stackoverflow.com/questions/8610743/… para obtener una alternativa correcta.
Karl Richter
56

Suponiendo que solo desea rechazar cadenas que coincidan con la expresión regular por completo (es decir, mmblaestá bien, pero mmno lo está), esto es lo que desea:

^(?!(?:m{2}|t)$).*$

(?!(?:m{2}|t)$) es un negativo mirada hacia el futuro ; dice "a partir de la posición actual, los siguientes caracteres no son mmo t, 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.

Alan Moore
fuente
2
La parte más útil de esta respuesta es que debe agregar .*al final de su expresión regular, de lo contrario rechazará todas las cadenas.
Rav
2
El $ 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.
Tom Dibble
1
\b(?=\w)(?!(ma|(t){1}))\b(\w*)

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

Ofer Skulsky
fuente