nested regex

nested regex

am 22.05.2007 15:45:37 von unknown

Post removed (X-No-Archive: yes)

Re: nested regex

am 22.05.2007 15:50:01 von Frank Seitz

Martin Trautmann wrote:

> Wie macht man das richtig?

Mit split(), splice() und join().

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: nested regex

am 22.05.2007 16:07:03 von unknown

Post removed (X-No-Archive: yes)

Re: nested regex

am 22.05.2007 16:13:50 von Frank Seitz

Martin Trautmann wrote:
> On Tue, 22 May 2007 15:50:01 +0200, Frank Seitz wrote:
>>
>> Mit split(), splice() und join().
>
> Und dann durch-loopen, um's an der passenden Stelle einzufuegen?

Sieh Dir mal splice() genauer an.

> Frage am Rande: wie wuerde ich das machen, wenn ich ein komma-getrenntes
> Format habe?
>
> 1,'a','b,c','d''e',2,'f'
>
> ... also
> 1
> a
> b,c
> d'e
> 2
> f

Dann kannst Du die Zerlegung nicht mit split() machen.
Es gibt übrigens fertige Module für das CSV-Format. Siehe CPAN.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: nested regex

am 23.05.2007 14:58:00 von Ingo Menger

On 22 Mai, 15:45, Martin Trautmann wrote:

> $c =3D $a;
> $c =3D~ s/^(([^\t]*\t){2})([^\t]*)(\t[^\t]*)?(\t.*)*/$1$3\td$5/;

> Ich verstehe nicht ganz, warum ich Klammerebene 2 anscheinend brauche,

Klammerebene 2 brauchst du zum syntaktischen Klammern dessen, was
genau 2 mal vorkommen soll.
Klammerebene 1 brauchst Du. um den gesamten Wert aufzufangen, der aus
2 Teilwerten besteht.

Nehmen wir ein einfacheres Beispiel:
(a|b){2,4} # alle Wörter der Länge 2 bis 4, die nur
aus a und b bestehen
Hier hättest Du in $1 immer nur den letzten Buchstaben stehen. Es ist
klar, daß, wenn Du das gesamte Wort haben willst, die Klammer um den
Wiederholungsfaktor {2,4} herumreichen muß, also
((a|b){2,4})
Die innere Klammer brauchst Du nur aus syntaktischen Gründen, wie eine
alternative Schreibweise verdeutlicht:
([ab]{2,4})
In solchen Fällen kann man der Regex-Engine Arbeit sparen durch
Verwendung von (?...).

Re: nested regex

am 24.05.2007 12:52:27 von unknown

Post removed (X-No-Archive: yes)

Re: nested regex

am 24.05.2007 13:10:25 von Moritz Lenz

This is an OpenPGP/MIME signed message (RFC 2440 and 3156)
--------------enig4101A50BAC6E5E6C4BA063AD
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Hallo,

Martin Trautmann wrote:
> On 23 May 2007 05:58:00 -0700, Ingo Menger wrote:
>> In solchen Fällen kann man der Regex-Engine Arbeit sparen durch
>> Verwendung von (?...).
>=20
> -v please. Wie saeh's damit obiges Beispiel aus? Toothpicksyndrom ist
> ueberhaupt kein Ausdruck, wenn ich obiges auch noch escapen muesste...

(?:...) funktioniert wie (...), nur wird der gematchte String nicht in
einer capture-Variable $1, $2... etc gespeichert.
d.h (?:a|b){2,4} match zwei bis vier Zeichen aus [ab] ohne irgend etwas
zu capturen, ((?:a|b){2,4}) captured es in einer Variable.
Mehr dazu in perldoc perlre.

Grüße,
Moritz

--=20
Moritz Lenz
http://perl-6.de/ http://moritz.faui2k3.org/


--------------enig4101A50BAC6E5E6C4BA063AD
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFGVXKlAAkekJBI0yIRAvMXAJ4kEloCX0RdbVgq9LWQiS2Q2ot49wCf QE3Q
tpoM2564Gzy7/oIG0UH1c7I=
=zu2g
-----END PGP SIGNATURE-----

--------------enig4101A50BAC6E5E6C4BA063AD--

Re: nested regex

am 24.05.2007 13:24:22 von unknown

Post removed (X-No-Archive: yes)

Re: nested regex

am 24.05.2007 13:35:23 von Moritz Lenz

This is an OpenPGP/MIME signed message (RFC 2440 and 3156)
--------------enigEE4D9E6750DC30D433EE6FD0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Hallo,

Martin Trautmann wrote:
> On Thu, 24 May 2007 12:10:25 +0100, Moritz Lenz wrote:
>> > -v please. Wie saeh's damit obiges Beispiel aus? Toothpicksyndrom is=
t
>> > ueberhaupt kein Ausdruck, wenn ich obiges auch noch escapen muesste.=
.
>>=20
>> (?:...) funktioniert wie (...), nur wird der gematchte String nicht i=
n
>> einer capture-Variable $1, $2... etc gespeichert.
>=20
> d.h, es hilft mir nur, um aus z.B.
> ((?:a|b){2,4}) das innere capture auszublenden=20

richtig.

> - bringt mir
> ehrlichgesagt bei der Ersterstellung keinen massiven Vorteil:

Geschwindigkeit wäre eine Vorteil, ob du den als "massiv" bezeichnest,
weiß ich nicht.

> s/^(([^\t]*\t){2})([^\t]*)(\t[^\t]*)?(\t.*)*/$1$3\td$5/;
> oder
> s/^((?:[^\t]*\t){2})([^\t]*)(?:\t[^\t]*)?(\t.*)*/$1$2\td$3/;
>=20
> Das ?: hilft mir bisher vor allem, wenn ich in einen bisherigen Ausdruc=
k
> eine weitere Bedingung einfuege, ohne die Zaehlung hinten aktualisieren=

> zu wollen - und natuerlich hilft's meist nur, wenn's um einen Teil geht=
,
> der 'weggeworfen' werden kann.
>=20
> Lesbar sind beide Ausdruecke oben kaum - da hilft split.splice.join vie=
l
> eher:
>=20
> @b =3D split /[\t\n]/,$a;
> splice @b, 3, 1, "d";
> $a =3D join "\t", @b;

Das stimmt natürlich, wurde dir ja auch schon von Frank vorgeschlagen.

Wenn du Übersichtlichkeit willst, empfehle ich übrigens, Kommentare u=
nd
"extended" regexes zu verwenden:

s/^ ((?:[^\t]* \t){2}) # die ersten beiden Felder, mit Trennzeichen
([^\t]*) # Inhalt des dritten
(?:\t[^\t]*)? # usw.
(\t.*)* # müsste das nicht ((?:\t.*)*) sein?
/$1$2\td$3/x;

Grüße,
Moritz
--=20
Moritz Lenz
http://perl-6.de/ http://moritz.faui2k3.org/


--------------enigEE4D9E6750DC30D433EE6FD0
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFGVXh7AAkekJBI0yIRAtb2AKDxL/oaQGpsHJQgdvZ5dL/JzabgYACg n+WT
JKfM++5B8TIeEMLelFUzK/A=
=YEVN
-----END PGP SIGNATURE-----

--------------enigEE4D9E6750DC30D433EE6FD0--

Re: nested regex

am 24.05.2007 14:16:00 von unknown

Post removed (X-No-Archive: yes)

Re: nested regex

am 24.05.2007 17:05:57 von Ferry Bolhar

Ingo Menger:

Nur der Vollständigkeit halber:

> Nehmen wir ein einfacheres Beispiel:
> (a|b){2,4} # alle Wörter der Länge 2 bis 4, die nur aus a
und b bestehen

Das stimmt so nicht - diese Regex matcht _jedes_ Wort, das zwei
aufeinanderfolgende 'a' oder 'b' enthält. Der Ausdruck, der dem
enspricht, was du meinst, wäre:

/\b(a|b){2,4}\b/

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: nested regex

am 24.05.2007 17:11:24 von Frank Seitz

Ferry Bolhar wrote:
> Ingo Menger:
>
> Nur der Vollständigkeit halber:
>
>>Nehmen wir ein einfacheres Beispiel:
>>(a|b){2,4} # alle Wörter der Länge 2 bis 4, die nur aus a
>
> und b bestehen
>
> Das stimmt so nicht - diese Regex matcht _jedes_ Wort, das zwei
> aufeinanderfolgende 'a' oder 'b' enthält. Der Ausdruck, der dem
> enspricht, was du meinst, wäre:
>
> /\b(a|b){2,4}\b/

Nein, das meinte er nicht, er meinte

/^(a|b){2,4}$/

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: nested regex

am 25.05.2007 08:22:57 von Ferry Bolhar

Frank Seitz:

> >>Nehmen wir ein einfacheres Beispiel:
> >>(a|b){2,4} # alle Wörter der Länge 2 bis 4, die nur aus
a
> > und b bestehen
> >
> > Das stimmt so nicht - diese Regex matcht _jedes_ Wort, das zwei
> > aufeinanderfolgende 'a' oder 'b' enthält. Der Ausdruck, der dem
> > enspricht, was du meinst, wäre:
> >
> > /\b(a|b){2,4}\b/
>
> Nein, das meinte er nicht, er meinte
>
> /^(a|b){2,4}$/

Er hat von _Worten_ gesprochen - '\b' ist das Metazeichen
zum Setzen von Wortgrenzen. Dein Ausdruck würde z.B.

" abba "

nicht matchen. Ein '^' am Anfang und '$' am Ende ist ja nur
eine Spezialform des allgemeineren '\b'. Inwieweit dieser
Unterschied eine Rolle spielt, hängt natürlich von der
jeweiligen Aufgabenstellung und den Eingangsdaten ab.
Jedenfalls war

> (a|b){2,4} # alle Wörter der Länge 2 bis 4, die nur aus a
> und b bestehen

unrichtig (ungenau) charakterisiert, und darauf wollte ich
hinweisen.

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: nested regex

am 25.05.2007 09:11:40 von Frank Seitz

Ferry Bolhar wrote:
> Frank Seitz:
>>
>>Nein, das meinte er nicht, er meinte
>>
>>/^(a|b){2,4}$/
>
> Er hat von _Worten_ gesprochen

"Wort" ist in dem Fall ein Fachbegriff und meint
eine (vollständige) Zeichenkette, nicht einen
Teil einer Zeichenkette.

Man kann die Verankerung am Anfang und am Ende
auch weglassen, deswegen war das in dem ursprünglichen
Posting schon richtig.

> Jedenfalls war
>
>>(a|b){2,4} # alle Wörter der Länge 2 bis 4, die nur aus a
>> und b bestehen
>
> unrichtig (ungenau) charakterisiert, und darauf wollte ich
> hinweisen.

Unrichtig erscheint es nur, wenn man die Alltagssprache
zugunde legt, nicht in der Terminologie von formalen Sprachen.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: nested regex

am 26.05.2007 21:49:34 von Ferry Bolhar

Frank Seitz:

>> Jedenfalls war
>>
>>>(a|b){2,4} # alle Wörter der Länge 2 bis 4, die nur aus a
>>> und b bestehen
>>
>> unrichtig (ungenau) charakterisiert, und darauf wollte ich
>> hinweisen.
>
> Unrichtig erscheint es nur, wenn man die Alltagssprache
> zugunde legt, nicht in der Terminologie von formalen Sprachen.

Gerade im Falle regulärer Ausdrücke ist es wichtig (und wurde
hier ja auch schon öfters gezeigt), _genau_ zu sagen, was man
will bzw. nicht will. Und wenn jemand, wie weiter oben gezeigt,
schreibt, dass er mit (a|b){2,4}"alle Wörter der Länge 2 bis 4,
die nur aus a und b bestehen", bekommt, dann ist das unrichtig,
denn die angegebene Regex matcht z.B. auch

"erertddfggdssddssdaadfdfddfdd"

was wohl nicht das ist, was Ingo gemeint hat. Die Regex passt
vielmehr auf jede Zeichenfolge, die zwei bis vier aufeinander-
folgende a oder b oder eine Kombination daraus enthält. Und
das ist ja wohl - Terminologie hin oder her - nicht dasselbe.

Du bist aber gerne eingeladen, die Bedeutung von "\b" in einer
Regex in der Terminologie von formalen Sprachen zu beschreiben
(oder zuzugestehen, dass der Thread wieder mal in Wortklauberei
ausartet ;-).

LG, Ferry

Re: nested regex

am 27.05.2007 05:54:52 von Frank Seitz

Ferry Bolhar wrote:
> Frank Seitz:
>>
>>Unrichtig erscheint es nur, wenn man die Alltagssprache
>>zugunde legt, nicht in der Terminologie von formalen Sprachen.
>
> Gerade im Falle regulärer Ausdrücke ist es wichtig (und wurde
> hier ja auch schon öfters gezeigt), _genau_ zu sagen, was man
> will bzw. nicht will. Und wenn jemand, wie weiter oben gezeigt,
> schreibt, dass er mit (a|b){2,4}"alle Wörter der Länge 2 bis 4,
> die nur aus a und b bestehen", bekommt, dann ist das unrichtig,
> denn die angegebene Regex matcht z.B. auch
>
> "erertddfggdssddssdaadfdfddfdd"
>
> was wohl nicht das ist, was Ingo gemeint hat. Die Regex passt
> vielmehr auf jede Zeichenfolge, die zwei bis vier aufeinander-
> folgende a oder b oder eine Kombination daraus enthält. Und
> das ist ja wohl - Terminologie hin oder her - nicht dasselbe.
>
> Du bist aber gerne eingeladen, die Bedeutung von "\b" in einer
> Regex in der Terminologie von formalen Sprachen zu beschreiben
> (oder zuzugestehen, dass der Thread wieder mal in Wortklauberei
> ausartet ;-).

Das hat mit Wortklauberei nichts zu tun, Ferry.
In der Theorie der Formalen Sprachen, beschreibt ein regulärer Ausdruck
eine Menge von Worten (= Sprache) über einem Alphabet.
Das Alphabet besteht in dem Fall aus den Zeichen a und b.
Die Sprache, die der Ausdruck beschreibt, ist folgende Menge:

{aa, ab, ba, bb, aaa, aab, aba, ..., bbbb}

Das hat Ingo gemeint. Er hat sich einer exakten Ausdrucksweise
bedient. Du bist mit Deiner Interpretation auf dem Holzweg.
Tut mir leid, ist aber so.

Zu \b: \b ist ein bisschen schwierig, da es eine Bedingung
statt eines Zeichens oder einer Menge repräsentiert.
Spontan habe ich keine Idee, wie sich das in die Theorie
pressen ließe.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: nested regex

am 29.05.2007 12:44:42 von Ferry Bolhar

Frank Seitz:

> Das hat mit Wortklauberei nichts zu tun, Ferry.
> In der Theorie der Formalen Sprachen, beschreibt ein regulärer Ausdruck
> eine Menge von Worten (= Sprache) über einem Alphabet.
> Das Alphabet besteht in dem Fall aus den Zeichen a und b.
> Die Sprache, die der Ausdruck beschreibt, ist folgende Menge:
>
> {aa, ab, ba, bb, aaa, aab, aba, ..., bbbb}
>
> Das hat Ingo gemeint. Er hat sich einer exakten Ausdrucksweise
> bedient.

OK. Ich hatte nach seiner Beschreibung

> (a|b){2,4} # alle Wörter der Länge 2 bis 4, die nur
> aus a und b bestehen

zwar nicht diesen Eindruck, aber es soll so sein.

> Du bist mit Deiner Interpretation auf dem Holzweg. Tut mir leid,
> ist aber so.

Macht nichts. Ich danke dir für deine Erklärung. Ich hatte
allerdings bislang den Eindruck, dass es hier nicht so theoretisch
zugeht. Die meisten, die hier posten, stellen durchaus praktische
Fragen. Und das auch im Zusammenhang mit dem Begriff
"Wort".

Wäre interessant zu hinterfragen, wer außer mir in Ingos
obigem Kommentar "Wort" so wie ich oder als Teil einer
formalen Sprache verstanden hat... ;-)

> Zu \b: \b ist ein bisschen schwierig, da es eine Bedingung
> statt eines Zeichens oder einer Menge repräsentiert.
> Spontan habe ich keine Idee, wie sich das in die Theorie
> pressen ließe.

Wie lassen sich denn '^' und '$' hineinpressen?

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: nested regex

am 29.05.2007 13:10:05 von Frank Seitz

Ferry Bolhar wrote:
>
> Wäre interessant zu hinterfragen, wer außer mir in Ingos
> obigem Kommentar "Wort" so wie ich oder als Teil einer
> formalen Sprache verstanden hat... ;-)

Wer schonmal Kontakt zur Theoretischen Informatik hatte,
hat den Jargon sicher erkannt ohne groß drüber nachzudenken.

>>Zu \b: \b ist ein bisschen schwierig, da es eine Bedingung
>>statt eines Zeichens oder einer Menge repräsentiert.
>>Spontan habe ich keine Idee, wie sich das in die Theorie
>>pressen ließe.
>
> Wie lassen sich denn '^' und '$' hineinpressen?

Das ist nicht nötig, weil es bei den Formalen Sprachen
nicht um Teilstrings (Teilwörter) geht. Die Ausdrücke sind
dort sozusagen immer implizit per ^...$ verankert.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: nested regex

am 29.05.2007 20:49:18 von Markus Steinborn

Hallo Ferry,

[ ja, ich habe für Ferry noch eine Ergänzung zu Franks Erläiterungen ]

On Tue, 29 May 2007, Frank Seitz wrote:

> Ferry Bolhar wrote:
> > Wie lassen sich denn '^' und '$' hineinpressen?
>
> Das ist nicht nötig, weil es bei den Formalen Sprachen
> nicht um Teilstrings (Teilwörter) geht. Die Ausdrücke sind
> dort sozusagen immer implizit per ^...$ verankert.

bzw. Perlausdrücke, bei denen "^" bzw "$" fehlen, sind in Formualen
Sprachen so zu sehen, als ob ".*" am Anfang bzw. am Ende stünde (dann
natürlich implizit über die gesamte Eingabe).

Mit beiden Regeln lassen sich die unter Unix üblichen Regexps (das ^ und $
ist nicht perl-spezifisch) als verkürzte Schreibweise auffassen:
Implizites ".*" am Anfang oder am Ende, sofern nicht per Sonderzeichen
explizit anders vereinbart.

Anderseits: /^(11+)\1+$/ ist genau dann wahr, wenn der String nur aus
Einsen besteht UND die Anzahl der Einsen weder 1 noch eine Primzahl ist.
Von dieser Menge ist bekannt, dass sie in der Theorie der Formalen
Sprachen keine reguläre Sprache ist (z.B. weil es keinen Regex nach den
Regeln der Formalen Sprachen gibt, der sie beschreibt ODER weil es
keinen endlichen Automaten gibt, der sie erkennt). Diese Beispiel
zeigt, das Perl-Regexps eindeutig mehr können, als die der Formalen
Sprachen. Das "Böse" im Perlregexp ist dabei das "\1", welches es in
formalen Sprachen nicht gibt.


Grüße

Markus

PS: Sind Perl-Regexps eigentlich gegen Komplementbildung abgeschlossen?

Re: nested regex

am 30.05.2007 10:54:45 von Ingo Menger

On 27 Mai, 05:54, Frank Seitz wrote:
> Ferry Bolhar wrote:
> > Frank Seitz:
>
> >>Unrichtig erscheint es nur, wenn man die Alltagssprache
> >>zugunde legt, nicht in der Terminologie von formalen Sprachen.
>
> > Gerade im Falle regulärer Ausdrücke ist es wichtig (und wurde
> > hier ja auch schon öfters gezeigt), _genau_ zu sagen, was man
> > will bzw. nicht will. Und wenn jemand, wie weiter oben gezeigt,
> > schreibt, dass er mit (a|b){2,4}"alle Wörter der Länge 2 bis 4,
> > die nur aus a und b bestehen", bekommt, dann ist das unrichtig,

Nein, das ist völlig richtig. Du kannst alle diese Wörter aufzählen,
(siehe unten in Franks Antwort) und wirst sehen, daß jedes gematcht
wird.
Also ist die Aussage: "/(a|b){2,4}/ matcht alle Wörter der Länge 2 bis
4, die nur aus a und b bestehen" sogar im landläufigen Sinne korrekt.
Vergleiche: die Menge {2,3,4, ..., 100} enthält alle Primzahlen
kleiner 100.
Manchmal hilft Reformulierung: Es gibt kein Wort der Länge 2 bis 4,
das nur aus as und bs bestehet, das vom obigen RE nicht gematcht
würde.
Es gibt keine Primzahl < 100, die in der Menge nicht vorkommt.

>
> Das hat mit Wortklauberei nichts zu tun, Ferry.
> In der Theorie der Formalen Sprachen, beschreibt ein regulärer Ausdruck
> eine Menge von Worten (=3D Sprache) über einem Alphabet.
> Das Alphabet besteht in dem Fall aus den Zeichen a und b.
> Die Sprache, die der Ausdruck beschreibt, ist folgende Menge:
>
> {aa, ab, ba, bb, aaa, aab, aba, ..., bbbb}
>
> Das hat Ingo gemeint. Er hat sich einer exakten Ausdrucksweise
> bedient. Du bist mit Deiner Interpretation auf dem Holzweg.
> Tut mir leid, ist aber so.

Danke für die Klarstellung, genau so. Leider hat Google 2 Beiträge von
mir verschluckt, in denen ich ebendas darzustellen versucht habe.

> Zu \b: \b ist ein bisschen schwierig, da es eine Bedingung
> statt eines Zeichens oder einer Menge repräsentiert.
> Spontan habe ich keine Idee, wie sich das in die Theorie
> pressen ließe.

Man könnte es zweistufig machen. Zuerst bearbeitet man den zu
matchenden String so, daß am Anfang und am Ende sowie an Wortgrenzen
ein sonst nicht zum Alphabet gehöriges Zeichen eingefügt wird. Dann
transformiert man den Regex so, daß jeder primitive RE (literales
Zeichen oder Zeichenklasse) als (RE\b?) geschrieben wird und wendet
den transformierten RE auf den transformierten String an.

Re: nested regex

am 31.05.2007 12:30:06 von Ferry Bolhar

Ingo Menger:

> Nein, das ist völlig richtig. Du kannst alle diese Wörter aufzählen,
> (siehe unten in Franks Antwort) und wirst sehen, daß jedes gematcht
> wird.
> Also ist die Aussage: "/(a|b){2,4}/ matcht alle Wörter der Länge 2 bis
> 4, die nur aus a und b bestehen" sogar im landläufigen Sinne korrekt.
> Vergleiche: die Menge {2,3,4, ..., 100} enthält alle Primzahlen
> kleiner 100.

Ich verstehe, was du und Frank meint. Ich habe mir im Umgang
mit regulären Ausdrücken aber schon seit langem angewöhnt, nicht
nur zu überlegen, was sie matchen sollen, sondern auch, was sie
_nicht_ matchen sollen - das kann manchmal sehr nützlich sein.
Eure Aussage über das Matchverhalten von /(a|b){2,4}/ ist
natürlich richtig. Richtig ist aber auch, dass diese Regex nicht NUR
die von euch angeführten Wörter matcht, sondern, wie ich gezeigt
habe, auch auf Zeichenfolgen passt, die - zumindest im landläufigem
Sinn - mit Worten nichts zu tun haben. Und darauf wollte ich eben
hinweisen, da sonst jemand, der in dem Thread mitliest, ableiten
könnte, dass er z.B. mit /[a-z]{2,4}/ alle aus zwei bis vier Zeichen
bestehenden Worte eines Satzes matchen kann. Das kann er zwar
auch, aber eben nicht nur - er wird Einiges an Matches zurückbe-
kommen, das er nicht erwartet hat. Und das wollte ich eben auf-
zeigen.

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: nested regex

am 31.05.2007 12:55:12 von Ingo Menger

On 31 Mai, 12:30, "Ferry Bolhar" wrote:

> Und das wollte ich eben auf-
> zeigen.
>
> LG, Ferry

Schon klar, Ferry, aber man muß dann auch aufzeigen, daß dies eine
Frage der Implementierung in perl ist.
Ich würde deshalb nicht formulieren "/ba/ matcht 'Straßenbahn'"
sondern, "/ba/ matcht 'ba' und der perl-Operator ~=3D prüft, ob /ba/
irgendwo in der gegebenen Zeichenkette matcht."

Oder so, zumindest wenn es um Exaktheit geht.