bzw. (PHP) regular expressions
brand
- perl
Hi!
Durch ein Posting weiter unten, wo es um regular Expressions ging, bin ich auf "Problem" gestoßen, für das ich nirgends eine Lösung fand. Deshalb zwei Fragen:
ist es möglich (und wenn ja, wie) bei regular Expressions in der Maske eine _Zeichenkette_ auszuschließen. D.h. ich möchte einen Treffer erhalten wenn in einem String eine bestimmte Zeichenkette NICHT vorkommt.
Ich habe weder bei den regular Expressions für Perl noch nach POSSIX etwas gefunden)
kennt jemand eine gute online-Dokumentation über regular Expressions nach POSSIX (nicht nur eine kurze Einführung)
danke, mfG
BRAND
Hi,
- ist es möglich (und wenn ja, wie) bei regular Expressions in der Maske eine _Zeichenkette_ auszuschließen. D.h. ich möchte einen Treffer erhalten wenn in einem String eine bestimmte Zeichenkette NICHT vorkommt.
Ich habe weder bei den regular Expressions für Perl noch nach POSSIX etwas gefunden)
versuchs mal mit dem ^ .
- kennt jemand eine gute online-Dokumentation über regular Expressions nach POSSIX
»»(nicht nur eine kurze Einführung)
»»
http://www.phpbuilder.com/columns/dario19990616.php3,
http://php.comzept.de/regexp.htm,
<http://www.heise.de/ix/artikel/1998/11/178/ >,
http://www.forwiss.uni-passau.de/taetigkeiten/text/vi/regulaere_ausdruecke.html,
http://www.rittershofer.de/info/bagcb/regausd.htm.
Viel Spass.
Jan
Hallo Brand,
- ist es möglich (und wenn ja, wie) bei regular Expressions in der Maske eine _Zeichenkette_ auszuschließen. D.h. ich möchte einen Treffer erhalten wenn in einem String eine bestimmte Zeichenkette NICHT vorkommt.
Das kannst Du afaik ab Perl 5.00X mit vorausschauender Suche:
-> /irgendwas(?!wasanderes)nochwas/ findet "irgendwas" auf das auf keinen Fall "wasanderes" folgt.
Geht aber auch umgekehrt:
-> /irgendwas(?=wasanderes)nochwas/ findet "irgendwas" auf das auf jeden Fall "wasanderes" folgt.
Aber Achtung: "wasanderes" erscheint afaik nicht im Suchergebnis $& (wäre ja auch unerwünscht ;-), und kann nicht via $1 ... $X referenziert werden.
<untested>
Eine weitere Möglichkeit wäre, $` (alles was vor dem Suchergebnis liegt) bzw. $' (alles was nach dem Suchergebnis liegt) nach dem Ausdruck zu durchsuchen, der nicht vorkommen darf.
Gerade fällt mir noch was ein (das zwar imho der 2. Möglichkeit entspricht, aber nicht unterschlagen werden soll :-):
-> /(.*?)(irgendwas)(.*?)/ und dann $2 in $foo (das wollte ich schon immer mal sagen ;-) speichern, und $1 bzw. $3 nach "wasanderem" durchsuchen, bevor Du weiterarbeitest.
</untested>
Die letzten "beiden" Möglichkeiten gehen aber davon aus, das "irgendwas" gut vom Rest zu unterscheiden (d.h. bekannt) ist. <spass style="netlustig"> [Aufgabe: a) Was findet /(.*)(.*)(.*)/ ? b) Was steht in $1, $2, $3 ? ] </spass>
Wenn Du ein wenig experimentierst, findest Du mit Sicherheit die passende Möglichkeit (<selbsgeiseln style="schmerzen:aua">die letzten beiden erscheinen irgendwie viel zu aufwendig</selbsgeiseln> <g> ich hoffe das wird nicht vom Valligator gefressen</g>)
- kennt jemand eine gute online-Dokumentation über regular Expressions nach POSSIX (nicht nur eine kurze Einführung)
Bei POSSIX kenn ich mich leider auch nicht aus (mangels Beschäftigung mit dem fM :-)
Grüße
AlexBausW
P.S.: Ich hoffe das Posting ist politisch (und inhaltlich) korrekt ;-)
Hallo Ich bin`s nochmal
Eine kleine Korrektur für`s Archiv :-)
$ und $' von /irgendwas/ ist nicht das gleiche wie $1 und $3 von /(.\*?)(irgendwas)(.\*?)/, läuft aber imo im vorliegenden Fall bei geeigneter Wahl von "irgendwas" auf dasselbe hinaus. (Vergleiche $
mit $1, wenn "irgendwas" eq ".*" !)
So, jetzt ist hoffentlich alle Klarheit beseitigt ;-)
AlexBausW
Hi!
Das kannst Du afaik ab Perl 5.00X mit vorausschauender Suche:
-> /irgendwas(?!wasanderes)nochwas/ findet "irgendwas" auf das auf keinen Fall "wasanderes" folgt.
Genau das war's was ich gesucht habe (wäre ja auch seltsam gewesen, wenn es mit Perl reg.exp. nicht ginge). Etwas Äquivalentes habe ich bei Possix allerdings nicht gefunden :-(
Bei POSSIX kenn ich mich leider auch nicht aus (mangels Beschäftigung mit dem fM :-)
was ist fm? female??? ;-)
mfG
BRAND
Dank auch an Jan für die 2 Antworten
Hallo,
Bei POSSIX kenn ich mich leider auch nicht aus (mangels Beschäftigung mit dem fM :-)
was ist fm? female??? ;-)
<g>Auch nicht schlecht</g> Ich meint allerdings the f..... Manual <supergrins />, <scherz> das ich an einigen Stellen so gut kenne, wie Kolumbus Indien </scherz>
AlexBausW
Hallo!
Das kannst Du afaik ab Perl 5.00X mit vorausschauender Suche:
-> /irgendwas(?!wasanderes)nochwas/ findet "irgendwas" auf das auf keinen Fall "wasanderes" folgt.Genau das war's was ich gesucht habe (wäre ja auch seltsam gewesen, wenn es mit Perl reg.exp. nicht ginge). Etwas Äquivalentes habe ich bei Possix allerdings nicht gefunden :-(
Aufpassen muss man mit den Dingern aber schon:
Wenn z.B. - wie oben angegeben - "nochwas" ein konkreter Text ist, macht das Vorrausschauen nach "wasanderes" keinen Sinn.
In der Regeln möchte man eine Textbereich suchen, der aus einem bestimmten Satz von Zeichen bestehen kann ( [a-z,_-] ), aber einen konkreten Ausschlusstext nicht enthält. Wenn man das einfach in Form von
/[a-z,_-]*(?!noprint)[a-z,_-]*/
anwendet, wird es nicht funktionieren (auch nicht mit ? am Stern)! Die RegExp kann ja so "verschoben" werden, dass der zweite Teil nie mit "noprint" anfängt. Was man hier also machen muss? Hinter jedem einzelnen Zeichen aus der Auswahl darf der Ausschlusstext nicht vorkommen:
/(a-z,_-)*/
Wenn der Ausschlusstext nicht allzu aufwendig ist, kann sich das Konstrukt auch selbst basteln - möglicherweise wird so etwas dann schneller verarbeitet als das ewige Vorausschauen (hier nur mit "nop" ;-):
/([a-mo-z,_-]n[a-mp-z,_-]no[a-mq-z,_-])*/ oder
/([a-mo-z,_-]n(?!o)no(?!p))*/
Viel Spass,
Jörk
Hinter jedem einzelnen Zeichen aus der Auswahl darf der Ausschlusstext nicht vorkommen:
/(a-z,_-)*/
Moment,
(...)* passt doch immer, oder? D.h. es wird ueberhaupt nichts ausgeschlossen.
/(a-z,_-)+/
erscheint mir im Moment richtig, aber ich wuerde doch das ganze mit
unless($str !~/noprint/)
{
...
}
abfangen.
Johannes
Johannes,
Hinter jedem einzelnen Zeichen aus der Auswahl darf der Ausschlusstext nicht vorkommen:
/(a-z,_-)*/Moment,
(...)* passt doch immer, oder? D.h. es wird ueberhaupt nichts ausgeschlossen.
/(a-z,_-)+/
Es geht doch hier eher um das generelle Prinzip, wie ich einen Text gewisser Form finden kann, der aber einen bestimmten String NICHT enthalten soll.
Nun weiß ich ja nicht, in welchen Zusammenhang dieses Problem aufgetreten ist ... also kann ich ja auch nur einen Lösungsansatz liefern, mit dem BRAND dann hoffentlich was anfangen kann.
erscheint mir im Moment richtig, aber ich wuerde doch das ganze mit
unless($str !~/noprint/)
{
...
}
abfangen.
Beispiel:
Du suchst alle <person ....> Tags innerhalb eines Dokumentes, die dann innerhalb einer Auswertung ausgegeben werden sollen. Die mit dem Attribute "noprint" jedoch nicht:
$str =~ /<person(^>)*>/i;
Dieser Ausdruck matched halt nur bei den gweünschten Tags. Ein * ist hier durchaus sinnvoll ...
Jörk
Hallo Alex und Brand
-> /(.*?)(irgendwas)(.*?)/ und dann $2 in $foo (das wollte ich schon immer mal sagen ;-) speichern, und $1 bzw. $3 nach "wasanderem" durchsuchen, bevor Du weiterarbeitest.
Hmm, braucht man wirklich die ? nach den Sternen? Greediness gibt doch auf jeden Fall zugunsten eines gesamten Treffers nach? Wenn aber (irgendwas) aus Sternchen und Punkten besteht, wird's sowieso kritisch.
Wie waere es einfach mit
unless ($suchstr=~m/irgendwas/)
{
...
}
Johannes
- kennt jemand eine gute online-Dokumentation über regular Expressions nach POSSIX (nicht nur eine kurze Einführung)
Hallo BRAND,
speziell ueber POSSIX weiss ich nichts, aber wenn du das Buch:
Mastering Regular Expressions
von Jeffry Friedl
Orelli-Verlag
noch nicht kennst, das kann ich dir nur empfehlen. Dort steht auch an vielen Stellen was ueber POSSIX-Regexe drin.
Johannes