util sheet matches cheat java regex

java - sheet - ¿Cómo verificar si un Regex dado es válido?



java util regex (5)

Tengo un pequeño programa que permite a los usuarios escribir algunas expresiones regulares. luego me gustaría comprobar si esta entrada es una expresión regular válida o no.

Me pregunto si hay un método de compilación en Java, pero no pude encontrar dicho jet.

¿Me puedes dar algún consejo?


Aquí hay un ejemplo.

import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; public class RegexTester { public static void main(String[] arguments) { String userInputPattern = arguments[0]; try { Pattern.compile(userInputPattern); } catch (PatternSyntaxException exception) { System.err.println(exception.getDescription()); System.exit(1); } System.out.println("Syntax is ok."); } }

java RegexTester "(capture" luego emite "Unclosed group" , por ejemplo.


La cosa más obvia sería utilizar el método de compilación en java.util.regex.Pattern y capturar PatternSyntaxException

String myRegEx; ... ... Pattern p = Pattern.compile(myRegEx);

Esto lanzará una excepción PatternSyntaxException si myRegEx no es válido.


Puede simplemente Pattern.compile la cadena de Pattern.compile regulares y ver si throws PatternSyntaxException .

String regex = "***"; PatternSyntaxException exc = null; try { Pattern.compile(regex); } catch (PatternSyntaxException e) { exc = e; } if (exc != null) { exc.printStackTrace(); } else { System.out.println("Regex ok!"); }

Este en particular produce el siguiente resultado:

java.util.regex.PatternSyntaxException: Dangling meta character ''*'' near index 0 *** ^

Respecto a las miradas

Aquí hay una cita de la antigua trusty regular-expressions.info :

Notas importantes sobre Lookbehind

Java lleva las cosas un paso más allá al permitir la repetición finita. Aún no puede usar la estrella o más, pero puede usar el signo de interrogación y las llaves con el parámetro máximo especificado. Java reconoce el hecho de que la repetición finita se puede reescribir como una alternancia de cadenas con longitudes diferentes pero fijas .

Creo que la frase contiene un error tipográfico, y probablemente debería decir "longitudes diferentes, pero finitas". En cualquier caso, Java parece permitir la alternancia de diferentes longitudes en lookbehind.

System.out.println( java.util.Arrays.toString( "abracadabra".split("(?<=a|ab)") ) ); // prints "[a, b, ra, ca, da, b, ra]"

También hay un error en el que puedes tener un aspecto de longitud infinita y hacer que funcione , pero no confiaría en esos comportamientos.

System.out.println( "1234".replaceAll(".(?<=(^.*))", "$1!") ); // prints "1!12!123!1234!"


public class Solution { public static void main(String[] args){ Scanner in = new Scanner(System.in); int testCases = Integer.parseInt(in.nextLine()); while(testCases>0){ String pattern = in.nextLine(); try { Pattern.compile(pattern); } catch(Exception e) { // System.out.println(e.toString()); System.out.println("Invalid"); } System.out.println("Valid"); } } }


public class Solution { public static void main(String[] args){ Scanner in = new Scanner(System.in); int testCases = Integer.parseInt(in.nextLine()); while(testCases>0){ String pattern = in.nextLine(); try{ Pattern.compile(pattern); System.out.println("Valid"); }catch(PatternSyntaxException exception){ System.out.println("Invalid"); } } } }