regular - java regex matcher
Java RegEx aspecto negativo detrĂ¡s (3)
Note dos cosas aquí:
Está utilizando
find()
que también devuelve true para una coincidencia de subcadena.Debido a lo anterior, "función" coincide porque no está precedida por "función".
La cadena completa nunca hubiera coincidido porque su expresión regular no incluía espacios.
Use Mathcher#matches()
o ^
y $
anchors con un lookahead negativo en su lugar:
Pattern pat = Pattern.compile("^(?!function)[//w//s]+$"); // added /s for whitespaces
Matcher mat = pat.matcher("function example");
System.out.println(mat.find()); // false
Tengo el siguiente código de Java:
Pattern pat = Pattern.compile("(?<!function )//w+");
Matcher mat = pat.matcher("function example");
System.out.println(mat.find());
¿Por qué mat.find()
devuelve true? Utilicé una mirada negativa y el example
está precedido por una function
. ¿No debería ser descartado?
Su cadena tiene la palabra "función" que coincide con / w +, y no está precedida por "función".
Vea lo que coincide:
public static void main(String[] args) throws Exception {
Pattern pat = Pattern.compile("(?<!function )//w+");
Matcher mat = pat.matcher("function example");
while (mat.find()) {
System.out.println(mat.group());
}
}
Salida:
function
xample
Así que primero encuentra la function
, que no está precedida por " function
". Luego encuentra el xample
que está precedido por la function e
y, por lo tanto, no es " function
".
Es probable que desee que el patrón coincida con todo el texto, no solo que encuentre coincidencias en el texto.
Puedes hacer esto con Matcher.matches()
o puedes cambiar el patrón para agregar anclajes de inicio y fin:
^(?<!function )//w+$
Prefiero el segundo enfoque, ya que significa que el patrón en sí define su región de coincidencia en lugar de la región que se define por su uso. Sin embargo, eso es solo una cuestión de preferencia.