Reguläre Ausdrücke - Was sagt und dieser reguläre Ausdruck?
Andreas-Lindig
- programmiertechnik
Hallo Forum,
ich bschäftige mich seit einer Woche mit regulären Ausdrücken und bin begeistert. Nur stoße ich immer wieder auf Details, die ich nicht verstehe - dieses Beispiel habe ich aus einem Buch, und es funktioniert auch genau wie beschrieben - nach meiner Logik dürfte es das aber nicht:
Aussage = "Weint meine kleiner Sonnenschein ?" <- Ausgangsstring
Ergebnis= Aussage.match(/ei.[+ˆ\S]/g) <- Suche liefert Array
wenn man nun die Elemente von 'Ergebnis' ausgibt erhält man:
eint
eine
hä?,
Ich lese den regulären Ausdruck so:
suche 'ei', gefolgt von einem beliebigen Zeichen (außer \n), gefolgt von: entweder nochmal beliebig oder einem nicht-nicht Whitespace (also ein Whitespace)
1. Warum bekomme ich ein anderes Ergebnis, wenn ich '\s' statt 'ˆ\S' in der Zeichenklasse schreibe ???
2. Warum findet der Ausdruck nicht:
eint
ein <-ein Leerzeichen
eine
ein <-ein Leerzeichen
vielen Dank für Hilfe und Gruß, Andreas
http://extra.andeas-lindig.de/was_ist_das_extra.htm
kleine Korrektur:
es muß heißen:
"Weint mein kleiner Sonnenschein ?"
nicht:
"Weint meine kleiner Sonnenschein ?"
^
und den regulären Ausdruck habe ich hier auf dem Mac etwas falsch getippt, so is richtig:
/ei.[+^\S]/g
jaja, diese Mac's...
Hallo,
/ei.[+^\S]/g
Ich kenne mich zwar nicht wirklich gut mit regulären Ausdrücken aus, aber ich versuch's trotzdem mal. Bitte korrigiert mich, falls ich etwas falsches vermute.
Das ^ dient - soweit ich weis - nur am *Anfang* einer Zeichenklasse als Verneinung. Wenn du also [^+\S] schreiben würdest, stände das für alle Zeichen, die weder beliebige, noch nicht-Whitespace sind. Das wäre - soweit ich das jetzt einschätzen kann - Schwachsinn.
Was ein ^ *zwischen* zwei Zeichen einer Zeichenklasse bewirkt, weis ich allerdings auch nicht.
Robert
Aussage = "Weint mein kleiner Sonnenschein ?" <- Ausgangsstring
Ergebnis= Aussage.match(/ei.[+^\S]/g) <- Suche liefert Array
wenn man nun die Elemente von 'Ergebnis' ausgibt erhält man:
eint
eine
hä?,
Ich lese den regulären Ausdruck so:
suche 'ei', gefolgt von einem beliebigen Zeichen (außer \n), gefolgt von: entweder nochmal beliebig oder einem nicht-nicht Whitespace (also ein Whitespace)
Nein, es heißt: Suche ei, ein beliebiges Zeichen (der Punkt) und dann kommt eine Zeichenklasse, bestehend entweder aus einem Plus, einem Dach-Ding (wie heißt das ^, Cirumflex?) oder einem Zeichen, das nicht eine Leerzeichen ist (\S).
Das Plus hat innerhalb der eckigen Klammern keine besondere Bedeutung (wäre auch sinnlos), das Dach nur am _Anfang_, direkt hinter der öffnenden Klammer.
Plus und Dach mit reinzunehmen ist wegen des \S eigentlich sinnlos, ich vermute mal, der Leser soll hier auf's Glatteis geführt werden - was dann bei Dir ja auch hervorragend funktioniert hat :)
- Warum bekomme ich ein anderes Ergebnis, wenn ich '\s' statt 'ˆ\S' in der Zeichenklasse schreibe ???
Weil er dann nach Plus, Dach oder einer Leerstelle sucht; das müssten dann die beiden "ein "s in "mein " und "Sonnenschein " sein.
- Warum findet der Ausdruck nicht:
eint
ein <-ein Leerzeichen
eine
ein <-ein Leerzeichen
Siehe oben, Leerzeichen sind im Original wegen \S nicht erwünscht.
Gruß,
soenk.e
Hi Sönke,
...Das Plus hat innerhalb der eckigen Klammern keine besondere Bedeutung (wäre auch sinnlos), das Dach nur am _Anfang_, direkt hinter der öffnenden Klammer.
Du hast mich aus dem Sumpf der Unwissenheit befreit, Du Lichtgestalt im Dunkel des Suchenden!
Plus und Dach mit reinzunehmen ist wegen des \S eigentlich sinnlos, ich vermute mal, der Leser soll hier auf's Glatteis geführt werden - was dann bei Dir ja auch hervorragend funktioniert hat :)
sieht so aus, hätten die ja auch mal in einem Lösungskapitel sich entschuldigen können, tse, tse...
ist denn dies ein Unterschied?:
[^ abc]
oder
[^abc]
und:
bezieht sich das Dach am Anfang auf die ganze Zeichenklasse oder nur auf das nächste Zeichen?
ja vielen Dank nochmal und Gruß, Andreas
http://dhtml.andeas-lindig.de -> Javascript -> reg.Ausdrücke
Hi!
ist denn dies ein Unterschied?:
[^ abc]
oder
[^abc]
Ja. Bei der ersten Variante darf auch ein Leerzeichen nicht vorkommen, bei der zweiten werden nur a, b und c ausgeschlossen. Mit Leerzeichen ist in diesem Fall wirklich nur das eine Zeichen (ASCII 32) gemeint, nicht etwa ein beliebiges Whitespace (\s). Ein Tab oder Zeilenumbruch darf also vorkommen.
und:
bezieht sich das Dach am Anfang auf die ganze Zeichenklasse oder nur auf das nächste Zeichen?
Auf die ganze Klasse.
So long
--
Your password must be at least 18770 characters and cannot repeat any of your previous 30689 passwords.
-- http://support.microsoft.com/default.aspx?scid=kb;en-us;Q276304