regular java regex regex-lookarounds

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.