Regex

Diskutiere Regex im HTML Forum im Bereich Programmierung; Hallo und Guten Morgen, ich habe ein kleines Problem. Regex ist leider für mich ein Buch mit 7 Siegeln, ich hoffe ihr könnt mir bitte helfen...
  • Regex Beitrag #1
D
dietrichf
Active member
Beiträge
27
Punkte Reaktionen
0
Hallo und Guten Morgen,

ich habe ein kleines Problem. Regex ist leider für mich ein Buch mit 7 Siegeln, ich hoffe ihr könnt mir bitte helfen.
Eine html-Seite zeigt folgenden String an:
20220119,16:20,7431,24,NaN,NaN,0.005,NaN,NaN
Ich benötige aber davon nur nacheinander 2 Werte (der wo gerade 7431 und der mit 24)
Wie kann ich diese mit Regex filtern? Die Tutorials bringen mich leider nicht weiter.
Vielen Dank im Voraus
Gruß
Didi
 
  • Regex Beitrag #2
D
dietrichf
Active member
Beiträge
27
Punkte Reaktionen
0
Mit dem Regex (.+?)(?:,|$) konnte ich schon auf die Werte zwischen den Kommas filtern. Aber wie bekomme ich das hin, dass jeweils nur ein bestimmter Wert zurückgegeben wird?
 
  • Regex Beitrag #3
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
Dies sollte den Zweck erfüllen:
Code:
/^\d{8},\d{2}:\d{2},(\d+),(\d+)/
 
  • Regex Beitrag #4
D
dietrichf
Active member
Beiträge
27
Punkte Reaktionen
0
Danke für die Antwort. Klappt schon mal gut.
Ich bräuchte aber verschiedene 2 Regex. Je Abruf nur einen Wert: einmal 24 und einmal die 7431. Wie würde das funktionieren? Danke im Voraus
 
  • Regex Beitrag #5
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
Dann brauchst Du nur die Klammern anders zu setzen:
/^\d{8},\d{2}:\d{2},(\d+),/ liefert den ersten Wert und
/^\d{8},\d{2}:\d{2},\d+,(\d+)/ den zweiten
 
  • Regex Beitrag #6
D
dietrichf
Active member
Beiträge
27
Punkte Reaktionen
0
Danke!!!!!!
 
  • Regex Beitrag #7
D
dietrichf
Active member
Beiträge
27
Punkte Reaktionen
0
Danke nochmals. Ich habe noch einen kleinen “Nachbrenner“ und hoffe, du könntest mir bitte nochmal helfen. Irgendwas klappt hier beim parsen der Webseite nicht.
Beispiel: curl -o /var/www/html/2.html http://127.0.0.1/1.html | grep -ioE "/^\d{8},\d{2}:\d{2},(\d+),/"
Eigentlich müsste er ja eine “Pseudo-html“ erstellen mit einem einzigen Wert?! Macht er aber nicht, er gibt wieder den ursprünglichen String:
20220119,16:20,7431,24,NaN,NaN,0.005,NaN,NaN
in Datei 2.html aus.
Kannst du mir bitte nochmal helfen? Vielen Dank im Voraus
 
  • Regex Beitrag #8
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
Ich hatte mich schon gewundert, warum Du das unter HTML gefragt fast, denn ich kenne Regexes vor allem im Zusammenhang mit einer Programmiersprache wie Javascript oder PHP. grep macht etwas anderes als Du dir vorstellst, es prüft ob eine Regex passt und gibt dann den ganzen String aus. Was Du vor hast, müsste eigentlich mit AWK gehen oder mit SED. Ich war damit früher ganz fit, aber es ist lange her. Wenn Du es nicht kennst, versuche ich mal, einen Einzeiler hinzubekommen.
 
  • Regex Beitrag #9
D
dietrichf
Active member
Beiträge
27
Punkte Reaktionen
0
Nein, awk oder sed kenne ich nicht. Wäre toll wenn du was bauen könntest. Danke.
P.S. Ich hatte einfach ein Forum gesucht, wo das Thema Regex schon mal behandelt wurde 😅
 
  • Regex Beitrag #11
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
Versuche, ob dies funktioniert:
Code:
sed --regexp-extended 's/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9],[0-9][0-9]:[0-9][0-9],([0-9]+),.*$/\1/p'
Das \d und die geschweiften Klammern verhalten sich bei sed etwas anders, daher musste ich die [0-9] vervielfachen.
Getestet hier:
https://sed.js.org/index.html#
 
  • Regex Beitrag #13
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
Hm, in welcher Umgebung bewegst Du dich denn? Ist ja wahrscheinlich ein Linux-Variante.
Und ohne das sed oder grep bekommst Du eine Ausgabe in der Form, die Du oben angegeben hast, nicht wahr:
20220119,16:20,7431,24,NaN,NaN,0.005,NaN,NaN
Wenn es mit sed nicht geht, könnten wir noch einen Versuch mit awk machen.
Versuche zunächst, das ^ und das $ wegzulassen, falls da noch Whitespaces herum geistern:
curl -o /var/www/html/3.html http://127.0.0.1/1.html | sed --regexp-extended 's/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9],[0-9][0-9]:[0-9][0-9],([0-9]+),.*/\1/p'
 
  • Regex Beitrag #14
D
dietrichf
Active member
Beiträge
27
Punkte Reaktionen
0
ja, Raspi OS
Es kommt folgender Fehler: curl: (3) [globbing] bad range in column 2
Edit: mein Fehler beim kopieren
 
  • Regex Beitrag #15
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
Ich nehme an bei der letzten Version ohne ^ und $?
 
  • Regex Beitrag #16
D
dietrichf
Active member
Beiträge
27
Punkte Reaktionen
0
Ne, hab mit „url“ mit kopiert…:rolleyes: Aber leider wird weiterhin der komplette String ausgegeben
 
  • Regex Beitrag #17
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
Um das einzugrenzen, versuche es mal zunächst mit echo:
echo '20220119,16:20,7431,24,NaN,NaN,0.005,NaN,NaN' | sed --regexp-extended 's/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9],[0-9][0-9]:[0-9][0-9],([0-9]+),.*/\1/p'
 
  • Regex Beitrag #18
D
dietrichf
Active member
Beiträge
27
Punkte Reaktionen
0
7431
7431
 
  • Regex Beitrag #19
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
Das ist ja perfekt. Fragt sich, warum es mit dem curl nicht geht. Leider verstehe ich den ganzen Konstrukt nicht richtig. Kannst Du es ein wenig erklären?
 
  • Regex Beitrag #20
D
dietrichf
Active member
Beiträge
27
Punkte Reaktionen
0
Ja, gerne.
Ich lade von einer Webseite via API Photovoltaikdaten herunter. Leider hat mein Wechselrichter kein Ethernet und ich muss ein altes Androidgerät als Bluetooth-Web-Connector nutzen. Das Handy lädt die Daten auf die Webseite. Von dort kann ich via Api die Daten abgreifen. Leider gibt es kein Json. Ein Skript lädt die html herunter. Ein weiteres Skript (der Befehl oben) soll nun den Wert auslesen und in 1. Wert in einer html und beim nächsten Durchgang den anderen Wert in einer weiteren html speichern. Dann kann ich über die openwb-Software diese speziellen htmls einlesen. Diese dürfen nur einen Wert enthalten, sonst gibts ne Fehlermeldung. Also doppelt ist auch nicht gut.
Ich hoffe, ich konnte es einigermaßen erklären. Schön wärs, wenns in einem Ritt gehen würde, aber die APIs sind etwas eingeschränkt
 
Thema:

Regex

Oben Unten