
Ich weiß nichts über reguläre Ausdrücke, aber ich muss in der Lage sein, Werte aus der letzten Zeile eines Protokolls auszuwählen, das wie folgt ausgedruckt wird:
80, 21-06-2017 20:42:27, 16.000 ,1392.000 ,4714.182
80, 21-06-2017 20:42:28, 6.000 ,860.500 ,810.000
80, 21-06-2017 20:42:29, 7.000 ,860.500 ,810.000
80, 21-06-2017 20:42:30, 7.000 ,354.000 ,405.000
Ich brauche einen regulären Ausdruck, der die Stelle erfasst, an der in diesem Fall die 354.000 (Zahl zwischen 100 und 9999) steht, und zwar wie folgt:
80, 21-06-2017 20:42:27, 16.000 ,1392.000 ,4714.182
80, 21-06-2017 20:42:28, 6.000 ,860.500 ,810.000
80, 21-06-2017 20:42:29, 7.000 ,860.500 ,810.000
80, 21-06-2017 20:42:30, 7.000 ,**354**.000 ,405.000
Und auch ein regulärer Ausdruck, der in diesem Fall die Stelle erfasst, an der sich die 405-Fehlermeldung befindet, etwa so:
80, 21-06-2017 20:42:27, 16.000 ,1392.000 ,4714.182
80, 21-06-2017 20:42:28, 6.000 ,860.500 ,810.000
80, 21-06-2017 20:42:29, 7.000 ,860.500 ,810.000
80, 21-06-2017 20:42:30, 7.000 ,354.000 ,**405**.000
Ich verwende ein Programm namens CrystalControl2, um Informationen von meinem Computer auf einem externen LCD-Bildschirm anzuzeigen. Das im Programm integrierte Tool zum Abrufen von Informationen aus Textdateien oder HTML-Seiten erfordert einen regulären Ausdruck, um Ergebnisse aus den ungefilterten Quellinformationen abzurufen.
Genauer gesagt fügt die Protokolldatei der Textdatei eine Zeile mit meinem GPU-Kerntakt und Speichertakt an den von mir markierten Stellen einmal pro Sekunde hinzu. Ich möchte diese aktualisierten Werte abrufen und sie über CrystalControl2 in Feldern auf dem LCD-Bildschirm anzeigen. Ich versuche, diese Werte abzurufen, ohne andere Software zu installieren, die von CrystalControl2 aus leichter zugänglich ist, um sowohl Softwarekonflikte zu vermeiden als auch eine Handvoll verschiedener Programme auszuführen, um alle Informationen zu referenzieren, die ich auf meinem LCD anzeigen möchte
Wie gesagt, diese Zahlen können entweder 3- oder 4-stellig sein … ist das überhaupt möglich?
Antwort1
Es gibt also offensichtlich einen ernsthaften Mangel an Dokumentation für das CrystalControl2-Regex-Format. Aber von dem, was ich aus der Betrachtung dersehrIch konnte nur wenige Beispiele finden, sie verwenden Gruppierungen, um den benötigten Text zu extrahieren. Einige haben mehr Gruppen als andere und mir war nicht klar, warum. Aber hier ist ein Versuch mit einem regulären Ausdruck, um die Zahlen im MSI Afterburner-Protokoll abzugleichen.
\D+(\d+)\.[^,]*,[^0-9,]*(\d+)\.[^,]*$
Wie?
Lassen Sie uns das also auseinandernehmen. Wir werden vom Ende aus rückwärts arbeiten, da wir einen Zeilenendeanker haben ( $
)
$
- Anker am Ende der Leine.Obwohl es mir anhand der Beispiele so erschien, als ob dies am Ende der Datei verankert wäre.
[^,]*
- null oder mehr Übereinstimmungen mit irgendetwasAberKommas\.
- Übereinstimmung mit einem Punkt (Dezimalzeichen).Das
\
ist notwendig, weil.
es in regulären Ausdrücken etwas Besonderes ist und bedeutet, dass alles übereinstimmt. Das\
macht es zu einem einfachen Punkt.(\d+)
- Ordnen Sie eine oder mehrere Ziffern zu und gruppieren Sie sie mit dem()
.Die Gruppe ermöglicht die Extraktion des Spielergebnisses.
,[^0-9,]*
- Übereinstimmung mit einem Komma, auf das null oder mehr Nicht-Ziffern oder Kommas folgen\.[^,]*
- Suchen Sie nach einem Punkt, gefolgt von null oder mehr Nicht-Kommas\D+(\d+)
- Finden Sie eine oder mehrere Nicht-Ziffern, gefolgt von einer oder mehreren Ziffern, und gruppieren Sie die Ziffern
Testen:
Da ich keinen Zugriff auf das LCD oder seine Software habe, habe ich zum Testen Perl wie folgt verwendet:
cat file1 | perl -lpe 's/\D+(\d+)\.[^,]*,[^0-9,]*(\d+)\.[^,]*$/:::: \1 xxx \2/'
Testergebnisse:
80, 21-06-2017 20:42:27, 16.000:::: 1392 xxx 4714
80, 21-06-2017 20:42:28, 6.000:::: 860 xxx 810
80, 21-06-2017 20:42:29, 7.000:::: 860 xxx 810
80, 21-06-2017 20:42:30, 7.000:::: 354 xxx 405
:::
Der reguläre Ausdruck hat also die letzten beiden Zahlen in der Zeile gefunden, wie zwischen den und zu sehen ist.xxx
Ergebnisaktualisierung aus Kommentaren
Antwort2
Nun, was haben Sie versucht,
Ich würde vorschlagen, einen Blick darauf zu werfenNimbleText, Ziemlich einfach zu bedienen
Ich verstehe Ihr Problem nicht ganz, habe hier aber einen Snippet erstellt, der Ihnen weiterhilft.
http://nimbletext.com/Live/-176683481/
<% ($3 > 100 && $3 < 9999) ? $3 : '' %> | <% ($4 > 100 && $4 < 9999) ? $4 : '' %>
Ich hoffe, das hilft