Hauptmenü

[gelöst]regexp

Begonnen von matze1999, 07 Februar 2022, 18:15:25

Vorheriges Thema - Nächstes Thema

matze1999

Hallo,

ich steig hier nicht durch, gibt es irgendwo eine Erklärung? Ich möchte gern icon mit verschiedenen Farben darstellen, aber ich komm nicht klar:

z.B.
ein Bereich von 2 - 39 soll in einer Farbe dargestellt werden
und 40 - 70

2-39: [[2-9]|2-3][0-9]
40-70: [4-6][0-9]|70

z.B. ist mir nicht klar wo hier [2-9]|2-3]]|40 "41" herkommt?

die Überprüfung mit regex101.com zeigt mir, dass ich irgendwo einen fehler habe, aber ich finde ihn  nicht, bzw. eigentlich verstehe ich das ganze nicht richtig.

matze1999

Beta-User

Das zweite sollte ja passen, das Problem ist aber, dass dein erster Ausdruck immer matcht, wenn irgendwo 2-9 drin ist. Das muss aber die alleinige Zahl sein... Versuch's mal damit:
[^0-9]*[2-9]|[23][0-9]
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

matze1999

Oh danke, Frage:

^ bedeutet "nicht", was bedeutet *

matze1999

matze1999

zu

[^0-9]*[2-9]|[23][0-9]

meint regex101.com da ist z.B. 40 und 50 dabei? Oder bediene ich das falsch?

matze1999

Beta-User

Der Zeilenumbruch ist das Problem...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

matze1999

aber auch ohne Zeilenumbruch ist "50" mit dabei :-(

OdfFhem

Für den Teil "davor" bzw. "dahinter" liegen im Ausdruck keine "echten" Einschränkungen vor.

Angenommen, beim zu prüfenden Wert handelt es sich grundsätzlich um Ganzzahlen, dann könnte z.B. folgender Ausdruck helfen:

^(?:[2-9]|[1-3]\d)$

matze1999


^(?:[2-9]|[1-3]\d)$

das passt, erklärst du mir noch, was die Zeichen bedeuten?

matze1999

betateilchen

Du brauchst doch die regexp nur bei regex101.com eingeben...


^(?:[2-9]|[1-3]\d)$

^ asserts position at start of a line

Non-capturing group (?:[2-9]|[1-3]\d)

1st Alternative [2-9]
Match a single character present in the list below [2-9]
2-9 matches a single character in the range between 2 (index 50) and 9 (index 57) (case sensitive)

2nd Alternative [1-3]\d
Match a single character present in the list below [1-3]
1-3 matches a single character in the range between 1 (index 49) and 3 (index 51) (case sensitive)

\d matches a digit (equivalent to [0-9])

$ asserts position at the end of a line

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

OdfFhem

Zitat von: matze1999 am 07 Februar 2022, 19:54:29
das passt, erklärst du mir noch, was die Zeichen bedeuten?

Da würde ich mich @betateilchen anschließen, da die Erläuterungen auf regex101.com recht ausführlich sind.
Neben EXPLANATION gibt es auch noch eine hilfreiche QUICK REFERENCE zu Common Tokens.

Sollten dennoch Fragen offen bleiben, kannst Du dich gerne nochmals melden ...

matze1999

ich habs doch noch nicht, ich verstehe es grundsätzlich wahrscheinlich nicht:

^(?:[2-9]|[1-3]\d)$

39:  3 aus [2-9] und 9 aus [2-9] passt
aber
43:  4 aus [2-9] und 3 aus [2-9]/[1-3] passt nicht.
und
1: wäre doch in [1-3] passt auch nicht


Ich habs jetzt anders gelöst, ich umgehe dieses regexp indem ich ein anderes Reading nutze.

matze1999

OdfFhem

#11
@matze1999

39 genügt dem regulären Ausdruck, 1 bzw. 43 nicht ... auf regex101.com leicht nachzuvollziehen


39 ... beruht auf der zweiten Alternative [1-3]\d ... 3 passt zu [1-3] und 9 zu \d, was einer Ziffer bzw. [0-9] entspricht

1 ... passt zu keiner der beiden Alternativen ... einstellig, aber nicht aus [2-9] ... zweistellig kann nicht gehen
43 ... passt zu keiner der beiden Alternativen ... einstellig kann nicht gehen ... zweistellig beginnt nie mit einer 4

matze1999

#12
@OdfFhem, Danke, jetzt bin ich etwas schlauer, das kann ich nachvollziehen, aber was mich noch verwirrt:

^ ?:

was bedeuten diese Zeichen, sind die überhaupt notwendig?

Damit kann ich nichts anfangen:

Zitat^ asserts position at start of a line
Non-capturing group (?:[2-9]|[1-3]\d)

dann müsste "60  -100" in etwa so aussehen (ja, habs auf regex101.com geprüft)

([6-9]\d|100)


matze1999

betateilchen

?: = non capturing group, vereinfacht gesagt, kann man damit was ignorieren. Gute Erklärung mit Beispielen hier: https://stackoverflow.com/questions/3512471/what-is-a-non-capturing-group-in-regular-expressions

^ = "Ausdruck beginnt mit..." und dazu gibt es auch noch das Gegenstück
$ = "Ende des Ausdrucks"

Das sind basics, die in den bereits empfohlenen references zu common tasks gut erklärt sind.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!