Forum: PC-Programmierung Regex: matche bestimmtes pattern, aber nicht für einen spezifischen präfix


von Der Freundliche Gast X. (Firma: mc.net) (friendly_offtopic)


Lesenswert?

Ich möchte in einem beliebigen string alle Vorkommen dieses Patterns 
matchen:

([0-9]\.[0-9]\.[0-9])

außer wenn es mit 1.2 anfängt. Das Stichwort ist wohl 
negative-lookahead, aber ich bekomme es im Regexbuilder nicht zusammen.

Beispiel:
<Tag Id1="1.1.1-text" Id2="1.1.2-text" Id3="1.2.3-text" />

soll dann 1.1.1 und 1.1.2 matchen, aber nicht 1.2.3

wie ist die korrekte Syntax dafür?

Ich habe nicht die Möglichkeit programmatisch einzugreifen im Sinne von 
"filter die Matches hinterher händisch aus"

: Bearbeitet durch User
von Christopher B. (chrimbo) Benutzerseite


Lesenswert?

Kannst du auch nicht zwei Regex hintereinander anwenden?

Ansonsten vielleicht in die Richtung
1
 ([0-9]\.[013-9]\.[0-9])|([02-9]\.[0-9]\.[0-9])

Beitrag #7552272 wurde vom Autor gelöscht.
von Der Freundliche Gast X. (Firma: mc.net) (friendly_offtopic)


Lesenswert?

Christopher B. schrieb:
> Kannst du auch nicht zwei Regex hintereinander anwenden?

leider nicht :-/

von Der Freundliche Gast X. (Firma: mc.net) (friendly_offtopic)


Lesenswert?

Das hier scheint zu tun:

(?!1\.2)([0-9]\.[0-9]\.[0-9])

https://regex101.com/r/MLPYW5/1

Ich habe nur noch nicht 100% verstanden warum, muss mir das mit 
lookahead / lookbehind nochmal ansehen.

von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

In eckigen Klammern bedeutet doch Einzeichenmuster.

Müßte das nicht auch gehen ?
1
([0-9]\.[013456789]\.[0-9])

von Rolf M. (rmagnus)


Lesenswert?

Heinz B. schrieb:
> Müßte das nicht auch gehen ?
> ([0-9]\.[013456789]\.[0-9])

Das würde fehlschlagen, wenn es z.B. mit 3.2 anfängt.

Der Freundliche Gast X. schrieb:
> https://regex101.com/r/MLPYW5/1
>
> Ich habe nur noch nicht 100% verstanden warum, muss mir das mit
> lookahead / lookbehind nochmal ansehen.

Soweit ich https://www.regular-expressions.info/lookaround.html 
entnehmen kann, ist das eigentlich ein negativer Lookahead. Es wird 
alles gematcht, das aus "nichts, nicht gefolgt von 1.2" und das dann 
gefolgt von drei durch Punkten getrennten Ziffern besteht.

: Bearbeitet durch User
von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

hab ich doch zu kurz gedacht.

von Flunder (flunder)


Lesenswert?

Wie sieht es mit
1
(([02-9]\.[0-9])|([0-9]\.[013-9]))\.[0-9])
aus ?

von Bruno V. (bruno_v)


Lesenswert?

wenn es immer genügend zeichen davor gibt, dann kannst Du mit NICHT 1 
und NICHT 2 anfangen.
Also
 * alles außer 1
 * beliebiges Zeichen (bzw. "\.")
 * alles außer 2
 ...

Für die Gruppe ist das nicht schlimm, die bestimmst Du ja mit Klammern 
(oder sonstwie)

von Der Freundliche Gast X. (Firma: mc.net) (friendly_offtopic)


Lesenswert?

Flunder schrieb:
> Wie sieht es mit
>
1
(([02-9]\.[0-9])|([0-9]\.[013-9]))\.[0-9])
> aus ?

Nope:

https://regex101.com/r/zn820K/1

von Flunder (flunder)


Lesenswert?

Tolle Seite um Regex auszuprobieren. Wenn Du das Zeilenendezeichen 
hinter dem Regex entfernst, funktioniert es besser.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.