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"));
}