2017-10-11 1 views
0

Ich habe mehrere Texte, die alle sind wie folgt strukturiert:Wie extrahiert man eine Liste von Informationen aus einer Regex-Gruppe?

> Record:  24G3KL 
> Source:  Whatever 
> System Time:Oct 10, 2017 19:01:00 (MST) 
> Result:  finalText 

Es gibt etwas mehr Text vor und nach diesem, aber es spielt keine Rolle.

Das Ziel ist es, die 6 alphanumerischen Zeichen (hier "24G3KL") jedes Mal zu extrahieren, wenn wir eine Linie mit > Result: finalText treffen. Das Wort "finalText" kann sich unterscheiden (zum Beispiel kann es abcdefText oder irgendetwas anderes sein). Ich bin nur am Wert "finalText" interessiert.

Ich bin mit dem folgenden regulären Ausdruck:

([A-Z0-9]{6})(?:.|\n)*(?:\s*finalText) 

Es funktioniert gut, und der 6 alphanumerischen Zeichen Wert wird auf die regex Gruppe extrahiert 1.

In Notepad ++, ich benutze das Suchfenster, setze Wählen Sie Reguläre Ausdrücke und klicken Sie auf die Schaltfläche Alle im aktuellen Dokument suchen.

Das Ergebnis ist eine Liste wie folgt aussehen:

Line 85186: > Result:  finalText 
Line 86200: > Result:  finalText 
Line 87258: > Result:  finalText 
Line 87721: > Result:  finalText 
Line 87761: > Result:  finalText 

Ich finde das komisch, weil „finalText“ durch die Regex nicht erfasst wird (beginnend mit „?“). Ich würde erwarten, dass meine Gruppe 1 (alle meine 6 alphanumerischen Zeichenwerte) statt dessen angezeigt wird.

[EDIT] Hier ist, was ich erhalten: picture1

Im Suchergebnisfenster unten, würde ich erwarten, dass die 6 alphanumerische Zeichen Werte anstelle der „finalText“ Werte zu sehen ...

Gibt es eine Möglichkeit, es zu tun?

+0

Auf den ersten Blick passt das Ergebnis, das Sie mit Notepad ++ erhalten, perfekt zu Ihrer Regex. Also verstehe ich nicht, wie diese Regex Ihnen die "Record:" - Referenz in einem anderen Kontext geben könnte (welche?). – cFreed

+0

Ich bin mir nicht sicher, ob Ihre Regex korrekt ist. Es sieht aus wie '(?:. | \ N) * (?: \ S * finalText)' sucht, bis es einen 'finalText' findet, und überspringt alle anderen' Result: 'Zeilen, die nicht mit' finalText' übereinstimmen. Sie werden also "Record" -Strings aufnehmen, die Sie nicht wollen. – Blorgbeard

+0

Siehe: https://regex101.com/r/L7DQlv/1 für was ich meine. – Blorgbeard

Antwort

0

Von dem, was ich sehen kann, passt es perfekt, verwenden Sie $ 1, um den Inhalt der ersten Klammern zu erfassen.

0

versuchte ich

([A-Z0-9]{6})\n.*\n.*\n> Result:\W*finalText 

Und das scheint zu funktionieren:

screenshot

unter der Annahme ist, dass es zwar immer genau zwei Linien zwischen Aufnahme und Ergebnis sind.

0
  • Ctrl +F
  • Suchen nach: > Record:\h*[A-Z0-9]{6}(?:\R.+){2}\R> Result:\h*finalText
  • Check Match case
  • Scheck Verpackung um
  • Check Regulärer Ausdruck
  • NICHT . matches newline
  • Suchen im Dokument ansehen

Erläuterung:

> Record:\h* : literally "> Record:" followed by 0 or more horizontal spaces 
[A-Z0-9]{6}  : 6 upper case letter or digit 
(?:    : non capture group 
    \R   : a line break 
    .+   : 1 or more any character 
){2}   : must be present twice 
\R    : a line break 
> Result:\h* : literally "> Result:" followed by 0 or more horizontal spaces 
finalText  : literally "finalText" 

Ergebnis für gegebenes Beispiel:

Search "> Record:\h*[A-Z0-9]{6}(?:\R.+){2}\R> Result:\h*finalText" (2 hits in 1 file) 
    new 2 (2 hits) 
    Line 1: > Record:  24G3KL 
    Line 9: > Record:  RNG3VS 
Verwandte Themen