Nennen Sie eine Gruppe regulärer Ausdrücke (Java)

einpacken

Hintergrund

Um die Teile vielseitig zu machen, verwenden wir manchmal reguläre Ausdrücke in Eigenschaftendateien.

Wenn Sie beispielsweise für jedes Element ein Protokoll der Form "time [thread name] error level class name --message" extrahieren möchten, können Sie wie folgt schreiben.

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

・ ・ ・
} 

Auf den ersten Blick sieht es vielseitig aus, aber diese Technik hat große Schwächen. Das heißt, die Reihenfolge der Gruppen kann nicht geändert werden. Dies liegt daran, dass der Java-Code die Reihenfolge der Gruppen angibt, in der die Werte der Gruppen abgerufen werden sollen.

Beispielsweise wird der Code unterbrochen, sobald der Threadname und die Reihenfolge der Fehlerstufen wie unten gezeigt geändert werden. Ich wollte es allgemein machen.

22:22:50.324 DEBUG [main]  org.springframework.boot.devtools.settings.DevToolsSettings - Included patterns for restart : [] 

Reguläre Ausdrucksgruppe mit benannter Forward-Suche

Ab Java 1.7 ist "Named Forward Lookup-Gruppe für reguläre Ausdrücke" verfügbar.

Sie können eine Gruppe regulärer Ausdrücke benennen, indem Sie "(? pattern)" schreiben.

Wenden wir es auf den regulären Ausdruck an.

log.pattern=(?<time>.+?) \[(?<thread>.+?)\](?<level>ERROR|INFO|DEBUG) (?<className>.*?) - (?<message>.*?)

Um dies abzurufen, verwenden Sie "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");

Da es nach Namen erfasst wird, kann es auch durch Ändern des regulären Ausdrucks behandelt werden, selbst wenn der Threadname und die Reihenfolge der Fehlerebenen geändert werden.

log.pattern=(?<time>.+?) (?<level>ERROR|INFO|DEBUG) \[(?<thread>.+?)\](?<className>.*?) - (?<message>.*?)

Es ist eine einfache, aber bequeme Funktion.

Referenz

Recommended Posts

Nennen Sie eine Gruppe regulärer Ausdrücke (Java)
[Java] Zusammenfassung der regulären Ausdrücke
[Java] Vergleichsmethode für Zeichenketten und Vergleichsmethode mit regulären Ausdrücken
Denken Sie an eine Java-Update-Strategie
Liste der Java-Objekte sortieren
Implementierung der Validierung mit regulären Ausdrücken
Eine kurze Beschreibung der JAVA-Abhängigkeiten
Der Ursprung von Java-Lambda-Ausdrücken
Verstehe die Lambda-Formel ein wenig
Reguläre Ausdrücke
[Java] Schauen wir uns die Switch-Ausdrücke (Vorschau) von JDK 13 an.
[Java] Gibt eine japanische Namensdatei im Dateinamen im HTTP-Header zurück
Reguläre Ausdrücke, die 99% der E-Mail-Adressen entsprechen
Einfach mit regulären Java-Ausdrücken zu stolpern
Benötigen Sie eine speicherbewusste Implementierung von Java?
[Java] Zusammenfassung, wie Lambda-Ausdrücke weggelassen werden
Messen Sie die Größe eines Ordners mit Java
Passen Sie IP-Adressen mithilfe regulärer Ausdrücke in Java an
Methodenname der statischen Factory-Methode, die aus Java 8 gelernt wurde
Eine Sammlung einfacher Fragen für Java-Anfänger
Ein kurzer Überblick über Java, das im Unterricht gelernt wurde
Methodenname der Methodenkette in Java Builder + α
[Java] Übersicht über Java
[Java] Schneiden Sie einen Teil der Zeichenfolge mit Matcher und regulären Ausdrücken aus
Extrahieren Sie Elemente, indem Sie mit Java reguläre Ausdrücke aus einer großen Menge von HTML ersetzen
Rufen Sie eine Liste mit MBean-Informationen für Java-Anwendungen ab
Ein kurzer Überblick über Java, das in Klasse 4 gelernt wurde
[Java Silver] Zusammenfassung der Punkte im Zusammenhang mit Lambda-Ausdrücken
Verwenden Sie Java-Lambda-Ausdrücke außerhalb der Stream-API
Awesome Java: Großartige Java Framework Library-Software
Erfahrung mit dem Bestehen von Java Silver als neuer Absolvent
Lass uns einen Roboter bauen! "Eine einfache Demo von Java AWT Robot"
[Java] Wie man Aufgaben regelmäßig ausführt
[Java] Beim Schreiben der Quelle ... Memorandum ①
Ein kurzer Überblick über Java, das in Klasse 3 gelernt wurde
Ein kurzer Überblick über Java, das in Klasse 2 gelernt wurde
Eine Übersicht über das native Java-Framework Quarkus von Kubernetes
Hinweise zur Verwendung regulärer Ausdrücke in Java
Eine Gruppe von Freunden, die niemals eine doppelte Einreichung zulassen
Voraussichtliche Funktionen von Java
[Java] Bedeutung der serialVersionUID
[Java] Erstellen Sie einen Filter
NIO.2 Überprüfung von Java
Bewertung von Java Shilber
Java - Vereinigung von Kommentaren
Verstehen Sie Java 8 Lambda-Ausdrücke
Java baut ein Dreieck
Hinweise zu regulären Ausdrücken
Geschichte der Java-Annotationen
Java (Verdienste des Polymorphismus)
Über Java-Lambda-Ausdrücke
Erläutern Sie Java 8-Lambda-Ausdrücke
NIO Bewertung von Java
Zusammenfassung der regulären Ausdrücke von Java
[Java] Drei Funktionen von Java
Zusammenfassung der Java-Unterstützung 2018
Die Geschichte der Erstellung einer Task-Management-Anwendung mit Swing, Java
Eine kurze Erklärung der fünf Arten von Java Static
Aktivieren Sie die Zelle A1 jeder Excel-Datei mit Java
Implementierung eines mathematischen Syntaxanalysators durch rekursive absteigende Syntaxanalysemethode (Java)