Capture Groups in Java

Table of Contents

Capture Groups

Im letzten Post haben wir einen kleinen Einstieg in Regex mit Java gemacht. Nun sehen wir uns an, wie man Regex Pattern in Java mittels Capture Groups anwenden kann:

        String regex = "(1[-.\\s])?(\\d{3}[-.\\s]?)(\\d{3}[-.\\s]?)\\d{4}";
        String phoneNumber = "12.523.231.4234";
        Pattern pat = Pattern.compile(regex);
        Matcher mat = pat.matcher(phoneNumber);

        if (mat.matches()){
            //System.out.format("entire String: %s\n", mat.group(0));
            System.out.format("Country Code: %s\n", mat.group(2));
            System.out.format("Area Code: %s\n", mat.group(4));
            System.out.format("Exchange Code: %s\n", mat.group(6));
            System.out.format("Line number Code: %s\n", mat.group(7));
        }

Damit können wir nun die einzelnen Nummern-Teile extrahieren und separat behandeln:

Country Code: 12
Area Code: 523
Exchange Code: 231
Line number Code: 4234

Not Capture Groups

Im Beispiel oben werden die Klammern fortlaufend nummeriert, jede Klammer wird von links nach rechts aufsteigend nummeriert, dabei werden auch die embeded Gruppen mitgezählt. Das hat den Nachteil das es etwas unübersichtlich wird, welche Nummer hat nun die Klammer in der Mitte. Dabei interessieren uns ja eigentlich immer nur die embeded Gruppen. Das können wir optimieren, indem wir bei den Klammern welche uns nicht interessieren ein '?:' direkt nach dem Öffnen der Klammer angeben. Das bedeutet dann soviel wir not Capture Group. Damit wird für die Klammern keine Gruppennummer vergeben:

        String regex = "(?:(\\d{1,2})[-.\\s])?(?:(\\d{3})[-.\\s]?)(?:(\\d{3})[-.\\s]?)(\\d{4})";
        String phoneNumber = "12.523.231.4234";

        Pattern pat = Pattern.compile(regex);
        Matcher mat = pat.matcher(phoneNumber);

        if (mat.matches()){
            //System.out.format("entire String: %s\n", mat.group(0));
            System.out.format("Country Code: %s\n", mat.group(1));
            System.out.format("Area Code: %s\n", mat.group(2));
            System.out.format("Exchange Code: %s\n", mat.group(3));
            System.out.format("Line number Code: %s\n", mat.group(4));
        }

Named Capture Groups

Noch mehr Optimieren können wir das mit Named Capture Groups:

        String regex = "(?:(?<countryCode>\\d{1,2})[-.\\s])?(?:(?<areaCode>\\d{3})[-.\\s]?)(?:(?<exchangeCode>\\d{3})[-.\\s]?)(?<lineNumber>\\d{4})";
        String phoneNumber = "12.523.231.4234";

        Pattern pat = Pattern.compile(regex);
        Matcher mat = pat.matcher(phoneNumber);

        if (mat.matches()){
            //System.out.format("entire String: %s\n", mat.group(0));
            System.out.format("Country Code: %s\n", mat.group("countryCode"));
            System.out.format("Area Code: %s\n", mat.group("areaCode"));
            System.out.format("Exchange Code: %s\n", mat.group("exchangeCode"));
            System.out.format("Line number Code: %s\n", mat.group("lineNumber"));
        }