¿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.


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


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.


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.