Tarea

Tienes una cadena de prueba S. Su tarea es escribir una expresión regular que coincida con S con las siguientes condiciones:

  • S consta de 8 dígitos.
  • S puede tener un separador "-" de modo que la cadena S se divida en 4 partes, con cada parte exactamente dos dígitos. (Ej. 12-34-56-78)

Lo intenté con esto: ^\d{2}(-?)(\1\d{2}){3}$ en Java pero no tuve suerte :(

Código:

public class Solution {    

    public static void main(String[] args) {

        Regex_Test tester = new Regex_Test();
        tester.checker("^\\d{2}(-?)(\\1\\d{2}){3}$"); // Use \\ instead of using \ 

    }
}

class Regex_Test {

    public void checker(String Regex_Pattern){

        Scanner Input = new Scanner(System.in);
        String Test_String = Input.nextLine();
        Pattern p = Pattern.compile(Regex_Pattern);
        Matcher m = p.matcher(Test_String);
        System.out.println(m.find());
    }   

}
2
RegexSolver101 5 may. 2020 a las 07:56

2 respuestas

La mejor respuesta

Pruebe con esta expresión regular: ^(\\d{2}(-*)\\d{2}\\2\\d{2}\\2\\d{2})$

Demo aquí

Código:

public class Solution {    

    public static void main(String[] args) {

        Regex_Test tester = new Regex_Test();
        tester.checker("^(\\d{2}(-*)\\d{2}\\2\\d{2}\\2\\d{2})$"); // Use \\ instead of using \ 

    }
}

class Regex_Test {

    public void checker(String Regex_Pattern){

        Scanner Input = new Scanner(System.in);
        String Test_String = Input.nextLine();
        Pattern p = Pattern.compile(Regex_Pattern);
        Matcher m = p.matcher(Test_String);
        System.out.println(m.find());
    }   

}
2
GolamMazid Sajib 5 may. 2020 a las 05:01

\\1 es una referencia inversa , que coincide con lo que se capturó por última vez en el primer grupo de captura. Eso no es lo que necesitas.

Puede hacer coincidir 8 dígitos o hacer coincidir \d{2}(?:-\d{2}){3} - 2 dígitos, seguidos de (un guión y 2 dígitos) 3 veces:

^(?:\d{8}|\d{2}(?:-\d{2}){3})$

https://regex101.com/r/T2qeJP/1

2
CertainPerformance 5 may. 2020 a las 05:00