Nommer un groupe d'expressions régulières (Java)

emballer

Contexte

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 : [] 

Groupe d'expressions régulières avec recherche directe nommée

À 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.

référence

Recommended Posts

Nommer un groupe d'expressions régulières (Java)
[Java] Résumé des expressions régulières
[Java] Méthode de comparaison de chaînes de caractères et méthode de comparaison utilisant des expressions régulières
Pensez à une stratégie de mise à jour Java
Trier la liste des objets Java
Implémentation de la validation à l'aide d'expressions régulières
Une brève description des dépendances JAVA
L'origine des expressions Java lambda
Comprendre un peu la formule lambda
Expressions régulières
[Java] Jetons un coup d'œil aux expressions de commutation (aperçu) du JDK 13.
[Java] Renvoie un fichier de nom japonais dans le nom de fichier dans l'en-tête HTTP
Expressions régulières qui correspondent à 99% des adresses e-mail
Facile à parcourir avec les expressions régulières Java
Avez-vous besoin d'une implémentation de Java compatible avec la mémoire?
[Java] Résumé de la façon d'omettre les expressions lambda
Mesurer la taille d'un dossier avec Java
Faire correspondre les adresses IP à l'aide d'expressions régulières en Java
Nom de la méthode de la méthode de fabrique statique apprise à partir de Java 8
Une collection de questions simples pour les débutants Java
Un examen rapide de Java appris en classe
Nom de méthode de la chaîne de méthodes dans Java Builder + α
[Java] Présentation de Java
[Java] Découpez une partie de la chaîne de caractères avec Matcher et des expressions régulières
Extraire des éléments en remplaçant une expression régulière d'une grande quantité de HTML avec java
Obtenir une liste d'informations MBean pour les applications Java
Un examen rapide de Java appris en classe part4
[Java Silver] Résumé des points liés aux expressions lambda
Utiliser des expressions Java lambda en dehors de l'API Stream
Awesome Java: excellent logiciel de bibliothèque de framework Java
Expérience de réussite de Java Silver en tant que nouveau diplômé
Faisons un robot! "Une simple démo de Java AWT Robot"
[Java] Comment exécuter des tâches régulièrement
[Java] Lors de l'écriture du source ... Mémorandum ①
Un examen rapide de Java appris en classe part3
Un examen rapide de Java appris en classe part2
Une vue d'ensemble du framework Java natif de Kubernetes Quarkus
Remarques sur l'utilisation des expressions régulières en Java
Un groupe d'amis qui n'autorisent jamais la double soumission
Caractéristiques prévues de Java
[Java] Importance de serialVersionUID
[Java] Créer un filtre
NIO.2 examen de Java
Avis sur Java Shilber
java --Unification des commentaires
Comprendre les expressions lambda Java 8
java construire un triangle
Notes sur les expressions régulières
Histoire des annotations Java
java (mérites du polymorphisme)
À propos des expressions Java lambda
Expliquer les expressions lambda Java 8
Examen NIO de Java
résumé des expressions régulières java
[Java] Trois fonctionnalités de Java
Résumé du support Java 2018
Histoire de créer une application de gestion de tâches avec Swing, Java
Une explication rapide des cinq types de statique Java
Activez la cellule A1 de chaque feuille de fichier Excel avec Java
Implémentation d'un analyseur de syntaxe mathématique par méthode d'analyse syntaxique descendante récursive (Java)