Nuestro grupo especializado pasados varios días de investigación y de recopilar de datos, han obtenido la respuesta, deseamos que te sea útil en tu proyecto.
Solución:
Necesitas agregar anclas. La expresión regular original (menos los paréntesis innecesarios):
/.0,4
… coincide con un string que contiene una barra inclinada seguida de cero a cuatro caracteres más. Pero, debido a que está utilizando el matches()
método se ancla automáticamente, como si fuera realmente:
^/.0,4$
Para lograr lo contrario, no puede confiar en el anclaje automático; tiene que hacer que al menos el ancla final sea explícito dentro de la anticipación. También tiene que “rellenar” la expresión regular con un .*
porque matches()
requiere que la expresión regular consuma todo string:
(?!/.0,4$).*
Pero le recomiendo que ancle explícitamente toda la expresión regular, así:
^(?!/.0,4$).*$
No hace daño y deja perfectamente clara su intención, especialmente para las personas que aprendieron expresiones regulares de otras versiones como Perl o JavaScript. El anclaje automático de la matches()
método es muy inusual.
Sé que esta es una pregunta muy antigua, pero espero que mi respuesta pueda ayudar a cualquiera que busque esto en el futuro.
Mientras que la respuesta de Alan Moore es casi correcta. También necesitaría agrupar toda la expresión regular, o de lo contrario corre el riesgo de anclar solo una parte de la expresión regular original.
Por ejemplo, si desea negar la siguiente expresión regular: abc|def
(que coincide con "abc"
o "def"
anteponiendo (?!
y anexando $).*
. Terminarás con (?!abc|def$).*
.
El ancla aquí solo se aplica a def
significa que "abcx"
no coincidirá cuando debería.
prefiero anteponer (?!(?:
y anexar )$).*
.
String negateRegex(String regex)
return "(?!(?:" + regex + ")$).*";
De mis pruebas parece negateRegex(negateRegex(regex))
de hecho sería funcionalmente lo mismo que regex
.
Si te gustó nuestro trabajo, eres capaz de dejar una noticia acerca de qué te ha parecido esta sección.