RegExp-Frage (Wiederholungen von Strings)

RegExp-Frage (Wiederholungen von Strings)

am 21.04.2006 09:07:24 von google.com

Hallo zusammen,

habe leider keine spezielle Regex(p)-Gruppe gefunden, hoffe daher
einfach mal, hier auch auf genug Regexp-Spezialisten zu treffen. :)

Aus folgenden Beispielstrings möchte ich Dinge extrahieren:

a|thumb|right|40px|b
a|thumb|40px|right|b
a|40px|thumb|right|b
a|thumb|right|b

Ich möchte die px-Zahl einzeln haben, der Rest soll gebündelt
dargestellt werden. Also _erwarte_ ich die folgenden Ergebnisse:

Match 1 Match 2 Match 3
|thumb|right |40px (Leer)
|thumb |40px |right
(Leer) |40px |thumb|right
|thumb|right (Leer) (Leer)

Meine Regexp sieht derzeit so aus:
a(\|thumb|\|right)*(\|?[0-9]+px)*(\|thumb|\|right)*|b

Tatsächlich erhalte ich aber folgende Matches:

Match 1 Match 2 Match 3
|right |40px (Leer)
|thumb |40px |right
(Leer) |40px |right
|right (Leer) (Leer)

Mit dem * hinter der Klammer von (\|thumb|\|right) versuche ich ja,
eine
Wiederholung des Inhaltes zu erreichen. Das scheint auch so zu
funktionieren, das dritte Beispiel matcht ja auch. Allerdings bleibt im

Match selbst das "letzte" gematchte Element stehen.

Gibt es einen Weg, auch das gesamte Gematchte anzuzeigen? Oder geht es
wirklich nur "unelegant" mit:

a(\|thumb\|right|\|right\|thumb|\|thumb|\|right)*(\|?[0-9]+p x)*(\|thumb\|ri=
ght|\|right\|thumb|\|thumb|\|right)*|b


Wenn ich nun mehr Elemente in Kombination habe (|left, |center, etc.),
dann komme ich damit in Teufels Küche. :)

Hat einer von euch eine Idee?

Stefan

Re: RegExp-Frage (Wiederholungen von Strings)

am 21.04.2006 11:08:33 von Ingo Menger

google.com@d00d.de schrieb:

> Hallo zusammen,
>
> habe leider keine spezielle Regex(p)-Gruppe gefunden, hoffe daher
> einfach mal, hier auch auf genug Regexp-Spezialisten zu treffen. :)
>
> Aus folgenden Beispielstrings möchte ich Dinge extrahieren:
>
> a|thumb|right|40px|b
> a|thumb|40px|right|b
> a|40px|thumb|right|b
> a|thumb|right|b
>
> Ich möchte die px-Zahl einzeln haben, der Rest soll gebündelt
> dargestellt werden. Also _erwarte_ ich die folgenden Ergebnisse:
>
> Match 1 Match 2 Match 3
> |thumb|right |40px (Leer)
> |thumb |40px |right
> (Leer) |40px |thumb|right
> |thumb|right (Leer) (Leer)
>
> Meine Regexp sieht derzeit so aus:
> a(\|thumb|\|right)*(\|?[0-9]+px)*(\|thumb|\|right)*|b
>
> Tatsächlich erhalte ich aber folgende Matches:
>
> Match 1 Match 2 Match 3
> |right |40px (Leer)

> Mit dem * hinter der Klammer von (\|thumb|\|right) versuche ich ja,
> eine
> Wiederholung des Inhaltes zu erreichen. Das scheint auch so zu
> funktionieren, das dritte Beispiel matcht ja auch. Allerdings bleibt im
> Match selbst das "letzte" gematchte Element stehen.

Ja, so funktioniert das. In der Klammer 1 steht halt nie |thumb|right,
sondern immer nur |thumb oder |right. Du müßtest hier mit einer extra
Klammer das Ganze einschließlich des * umschließen.

Aber warum so umständlich?

a(.*)(\|[0-9]+px)(.*)\|b

sollte es doch auch tun. (3 Teile, 3 Klammern)

Re: RegExp-Frage (Wiederholungen von Strings)

am 21.04.2006 23:04:01 von Oliver Block

Ingo Menger wrote:

> Aber warum so umständlich?
>
> a(.*)(\|[0-9]+px)(.*)\|b
>
> sollte es doch auch tun. (3 Teile, 3 Klammern)

hier funktioniert es nicht:

> a|thumb|right|b

Ich glaube nicht, daß er das mit einem Regulären Ausdruck lösen kann. Ich
würde nunächst auf (\d\dpx) prüfen und anschließend den Rest nehmen.

Gruss,

Oliver

Re: RegExp-Frage (Wiederholungen von Strings)

am 21.04.2006 23:16:36 von Oliver Block

google.com@d00d.de wrote:

> Hallo zusammen,
>
> habe leider keine spezielle Regex(p)-Gruppe gefunden, hoffe daher
> einfach mal, hier auch auf genug Regexp-Spezialisten zu treffen. :)
>
> Aus folgenden Beispielstrings möchte ich Dinge extrahieren:
>
> a|thumb|right|40px|b
> a|thumb|40px|right|b
> a|40px|thumb|right|b
> a|thumb|right|b
>
> Ich möchte die px-Zahl einzeln haben, der Rest soll gebündelt
> dargestellt werden. Also _erwarte_ ich die folgenden Ergebnisse:
>
> Match 1 Match 2 Match 3
> |thumb|right |40px (Leer)
> |thumb |40px |right
> (Leer) |40px |thumb|right
> |thumb|right (Leer) (Leer)

Die Logik mußt Du mir jetzt erklären!!!

/a\|(\D*)(\d\dpx)?(.*)\|b/

Sollte funktionieren, mit dem Schönheitsfehler, daß die Tilde nicht vor der
40px steht, sondern am Ende von Match1. Falls du auch einstellige px-Zahlen
hast, solltest Du das zweite mit einem ? suffigieren:) ).

Gruss,

Oliver

Re: RegExp-Frage (Wiederholungen von Strings)

am 24.04.2006 10:25:52 von Ingo Menger

Oliver Block schrieb:

> Ingo Menger wrote:
>
> > Aber warum so umständlich?
> >
> > a(.*)(\|[0-9]+px)(.*)\|b
> >
> > sollte es doch auch tun. (3 Teile, 3 Klammern)
>
> hier funktioniert es nicht:
>
> > a|thumb|right|b
>
> Ich glaube nicht, daß er das mit einem Regulären Ausdruck lösen kan=
n Ich
> würde nunächst auf (\d\dpx) prüfen und anschließend den Rest nehm=
en.

Au, das hab ich übersehen. Ich war davon ausgegangen, daß ein px
immer da ist. Aber, das macht ja nichts, wenn der obige Regex nicht
matcht, dann kann man diesen Sonderfall extra behandeln.