Regexp - ich glaube, ich bin zu doof dafür.:-(

Begonnen von grossmaggul, 02 November 2017, 15:08:27

Vorheriges Thema - Nächstes Thema

grossmaggul

Hallo,

ich habe jetzt schon einige Tutorials durchgearbeitet, aber irgendwie bleiben die regex für mich ein Buch mit fast sieben Siegeln.
Die Grundzüge verstehe ich so einigermaßen, die komplexeren Teile nicht mehr.:-(

Ich versuche mich gerade daran aus einem CustomReading, die für mich interessanten Sachen rauszuschnippeln.
Ich möchte das RAID System meines Servers überwachen und mittels Tablet UI den Status des RAIDs anzeigen.

Das CustomReading ruft "cat /proc/mdstat" auf und ergibt dann folgendes.


Personalities : [raid1]
md3 : active raid1 sda4[2] sdb4[3]
      2632384 blocks super 1.2 [2/2] [UU]
     
md2 : active raid1 sdb3[3] sda3[2]
      920518464 blocks super 1.2 [2/2] [UU]
     
md1 : active raid1 sdb2[3] sda2[2]
      52395904 blocks super 1.2 [2/2] [UU]
     
md0 : active raid1 sdb1[0] sda1[1]
      1048512 blocks [2/2] [UU]
     
unused devices:


Ich würde da gerne mit Regex die RAID-Devices "mdX", sowie die Devices sdaX und sdbX sowie die aktiven Platten "[2/2][UU]" rausschnipseln und dann mittels Tablet UI darstellen und zwar so:

<!-- RAID Status -->
<div class="top-space-2x">
     <header class="big">RAID</header>
     <div data-type="label"
          data-device="sys.raid_status"
          data-get="raid_status"
          data-part="XXXXXXXXX"
          class="cell">
    </div>
</div>


Die XXXXXXXXX müssten durch das Regex ersetzt werden, hoffe ich.

Vielleicht bin ich ja auch auf dem komplett falschen Dampfer und man müßte das anders machen.

Kann mir da jemand helfen, ich möchte jetzt gar nicht eine Komplettlösung vorgekaut bekommen, ich würde diese vemaledeiten Regex gerne mal verstehen.:-/

gm
FHEM auf Debian 12 Bookworm Server, Supermicro Core2Duo Board, 2 TB HD RAID 1, 8GB RAM, 2 x nanoCUL868, 1 x nanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1,WLED

betateilchen

Das Problem ist, dass die Ergebnisse immer in zwei Zeilen stehen.

Geh mal auf regex101.com und teste folgendes:



Als regex:
(^md.).*(\[.\/.]).*(\[..])

Als teststring:
md3 : active raid1 sda4[2] sdb4[3] 2632384 blocks super 1.2 [2/2] [UU]



Dann siehst Du rechts im Ergebnis die drei gewünschten Werte in den Gruppen 1-3.

Wie man das Problem mit dem mehrzeiligen Input löst, fällt mir grade nicht ein...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

amenomade

#2
Zitat von: betateilchen am 02 November 2017, 16:24:31
Das Problem ist, dass die Ergebnisse immer in zwei Zeilen stehen.

Wie man das Problem mit dem mehrzeiligen Input löst, fällt mir grade nicht ein...

Mit (?s)am Anfang, oder? Sowas in der Art?
(?s).*?(md.).*?(\[.\/.]).*?(\[..])
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

Oder so?
(?s).*?(md.).*?(sd..).*?(sd..).*?(\[.\/.]).*?(\[..])

mit Teststring:
Personalities : [raid1]
md3 : active raid1 sda4[2] sdb4[3]
      2632384 blocks super 1.2 [3/3] [U3]
     
md2 : active raid1 sdb3[3] sda3[2]
      920518464 blocks super 1.2 [2/2] [U2]
     
md1 : active raid1 sdb2[3] sda2[2]
      52395904 blocks super 1.2 [1/1] [U1]
     
md0 : active raid1 sdb1[0] sda1[1]
      1048512 blocks [0/0] [U0]

ergibt
ZitatMatch1
Full match   0-100   `Personalities : [raid1]
md3 : active raid1 sda4[2] sdb4[3]
      2632384 blocks super 1.2 [3/3] [U3]`
Group 1.   24-27   `md3`
Group 2.   43-47   `sda4`
Group 3.   51-55   `sdb4`
Group 4.   90-95   `[3/3]`
Group 5.   96-100   `[U3]`


Match 2
Full match   100-185   `
md2 : active raid1 sdb3[3] sda3[2]
      920518464 blocks super 1.2 [2/2] [U2]`
Group 1.   107-110   `md2`
Group 2.   126-130   `sdb3`
Group 3.   134-138   `sda3`
Group 4.   175-180   `[2/2]`
Group 5.   181-185   `[U2]`

Match 3
Full match   185-269   `   
md1 : active raid1 sdb2[3] sda2[2]
      52395904 blocks super 1.2 [1/1] [U1]`
Group 1.   192-195   `md1`
Group 2.   211-215   `sdb2`
Group 3.   219-223   `sda2`
Group 4.   259-264   `[1/1]`
Group 5.   265-269   `[U1]`

Match 4
Full match   269-342   `   
md0 : active raid1 sdb1[0] sda1[1]
      1048512 blocks [0/0] [U0]`
Group 1.   276-279   `md0`
Group 2.   295-299   `sdb1`
Group 3.   303-307   `sda1`
Group 4.   332-337   `[0/0]`
Group 5.   338-342   `[U0]`
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

grossmaggul

Danke erstmal, ich verstehe bei dem
(?s).*?(md.).*?(sd..).*?(sd..).*?(\[.\/.]).*?(\[..])

zwar nix, aber zumindest im regex tester gibt es ein mir passendes Ergebnis, eingetragen in das data-part Feld des Labelwidgets der UI gibt es einen Error.:-(

FHEM auf Debian 12 Bookworm Server, Supermicro Core2Duo Board, 2 TB HD RAID 1, 8GB RAM, 2 x nanoCUL868, 1 x nanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1,WLED

amenomade

Was für einen Error?

Vermultich akzeptiert data-part mehrere Capturing Groups nicht...
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

grossmaggul

ZitatWas für einen Error?
Error
fhem-tablet-ui.js:1613


ZitatVermultich akzeptiert data-part mehrere Capturing Groups nicht...
Ahja, heißt was?
FHEM auf Debian 12 Bookworm Server, Supermicro Core2Duo Board, 2 TB HD RAID 1, 8GB RAM, 2 x nanoCUL868, 1 x nanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1,WLED

amenomade

Hab in Code nachgeschaut. Er sollte doch akzeptieren.

var matches = value.match(new RegExp('^' + part + '$'));

Etwas gefählt im nicht in der Regex...
Versuch mal erstmal mit nur (?s).*?(md.).*
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

grossmaggul

Funktioniert leider auch nicht.

Wäre es möglich zu erklären, was der oben aufgeführte Regex-Ausdruck genau macht?
Das hier ist das Anfängerforum und da wäre es schön, wenn man ein paar erklärende Worte dazu bekäme.
FHEM auf Debian 12 Bookworm Server, Supermicro Core2Duo Board, 2 TB HD RAID 1, 8GB RAM, 2 x nanoCUL868, 1 x nanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1,WLED

amenomade

Wenn Du es in https://regex101.com eingibst, wie schon von betateilchen erwähnt, wird alles oben rechts Schritt für Schritt erklärt.

ZitatFunktioniert leider auch nicht.
Und mit nur
(md.).*?(sd..).*?(sd..)?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus