(? <Name> pattern)
.Matcher # group (String name)
.Afin de rendre les pièces polyvalentes, nous utilisons parfois des expressions régulières dans les fichiers de propriétés.
Par exemple, si vous souhaitez extraire un journal sous la forme de «time [thread name] error level class name --message» pour chaque élément, vous pouvez écrire comme suit.
log.pattern=(.+?) \[(.+?)\](ERROR|INFO|DEBUG) (.*?) - (.*?)
String log = "22:22:50.324 [main] DEBUG org.springframework.boot.devtools.settings.DevToolsSettings - Included patterns for restart : []";
String patternString = getProperty("log.pattern");
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(log);
if (matcher.matches()) {
String time = matcher.group(1);
String thread = matcher.group(2);
String level = matcher.group(3);
String className = matcher.group(4);
String message = matcher.group(5);
・ ・ ・
}
À première vue, elle semble polyvalente, mais cette technique présente des faiblesses majeures. Autrement dit, l'ordre des groupes ne peut pas être modifié. En effet, le code Java spécifie l'ordre des groupes pour récupérer les valeurs des groupes.
Par exemple, le code est interrompu dès que le nom du thread et l'ordre du niveau d'erreur sont modifiés comme indiqué ci-dessous. J'avais l'intention d'en faire un usage général.
22:22:50.324 DEBUG [main] org.springframework.boot.devtools.settings.DevToolsSettings - Included patterns for restart : []
À partir de Java 1.7, le "Groupe d'expressions régulières de recherche directe nommé" est disponible.
Vous pouvez nommer un groupe d'expressions régulières en écrivant (? <Nom> modèle)
.
Appliquons-le à l'expression régulière.
log.pattern=(?<time>.+?) \[(?<thread>.+?)\](?<level>ERROR|INFO|DEBUG) (?<className>.*?) - (?<message>.*?)
Pour récupérer cela, utilisez Matcher # group (String name)
String time = matcher.group("time");
String thread = matcher.group("thread");
String level = matcher.group("level");
String className = matcher.group("className");
String message = matcher.group("message");
Puisqu'il est acquis par nom, même si le nom du thread et l'ordre du niveau d'erreur sont modifiés, il peut être géré en changeant simplement l'expression régulière.
log.pattern=(?<time>.+?) (?<level>ERROR|INFO|DEBUG) \[(?<thread>.+?)\](?<className>.*?) - (?<message>.*?)
C'est une fonction simple mais pratique.