Regular Expressions...



  • Hi Coders!

    Da ich mich jetzt mal in Regular Expressions einarbeite, stehe ich direkt schon vor meinem ersten Problem :(.

    Wie kann ich folgenden String über eine Regular Expression suchen:

    'Hello World'
    

    Man beachte das einfache Hochkomma, welches als Stringbegrenzer dient.
    Ich will nun genau diesen String via Regular Expression finden, und zwar inklusive der beiden Hochkommata.

    Mein folgender Versuch schlug fehl:

    /^'*$'/
    

    Jemand ne Ahnung, wie ich das lösen könnte??

    Es soll halt alles gefunden werden, was von ' und ' umschlossen ist.

    Dank & Gruß
    ~code_pilot

    PS: Gibt es irgendwo eine art Portal, wo man auch Tipps und Tricks zu Regular Exressions finden kann?





  • code_pilot schrieb:

    PS: Gibt es irgendwo eine art Portal, wo man auch Tipps und Tricks zu Regular Exressions finden kann?

    http://www.regular-expressions.info/

    Hitsch



  • /^'.*$'/
    

    du hast den Punkt vergessen gehabt 😉 Das '*' in RE steht dafuer, dass das vorhergehende Zeichen beliebig oft vorkommen kann. Der Punkt hingegen sagt "jedes Zeichen kann an dieser Stelle stehen. Zusammen ergibt das dann also "beliebig viele beliebige Zeichen" koennen hier stehen.



  • Vielleicht hilft dir das hier beim lernen.



  • Hm, in Blue-Tigers Variante stört mich das $ ein wenig, Zeilenende möchtest Du ja wohl nicht. Außerdem ist die uU etwas zu gierig, wenn Du sowas schreibst:

    hallo 'string1' rhabarber, rhabarber, 'string2'welt
    

    Dann wird nämlich "'string1' rhabarber, rhabarber, 'string2'" gematcht, also vom ersten bis zum letzten '. Um das zu umgehen, kannst Du etwas in der Art von \'[^\']* schreiben, damit triffst Du dann nur string1 und string2.



  • Hallo,

    Ich danke Euch erstmal für eure Hilfe!

    Allerdings:
    @nman:

    Dein Beispiel funktioniert nur teilweise ;).
    Ich habe den RegEx-Coach zum testen benutzt. Er markiert aus folgendem String nur das Fettgedruckte bei deiner Expression \'[^\']*

    This is a 'Hello World' test with two strings 'Regular Expression' blubb!

    Das geünschte ergebnis ist natürlich

    This is a 'Hello World' test with two strings 'Regular Expression' blubb!

    Danke & Gruß
    ~code_pilot



  • Naja, das war ja auch nur ein funktionierender Baustein, Komplettlösung mittels Bausteine zusammensetzen bleibt dem denkenden Leser überlassen. 🙂

    Überleg Dir am besten, ob Du da nicht einfach nur drüberiterieren möchtest...



  • @nman:

    So bekomme ich es hin, dass der erste Sting richtig erkannt wird:

    '[^']+'

    Allerdings nur der erste, nicht der zweite.

    Was muss ich denn tun, um den zweiten auch zu finden?

    Danke & Gruß
    ~code_pilot 🙂



  • code_pilot schrieb:

    Was muss ich denn tun, um den zweiten auch zu finden?

    Wie gesagt, einfach über Deinen Text drüberiterieren.



  • Hmm okay aber warum bekomme ich, wenn ich diese Regular-Expression in folgendem PHP-Script

    $text = "'Hello World' by 'code_pilot'";
    
    	$text = preg_replace_callback(
    			"'[^']*'",
    			create_function('$matches', 'return \'<b>\' . $matches[0] . \'</b>\';'),
    			$text );
    
    	echo "Result: " . $text;
    

    Benutzen will, nur eine Warning:

    Warning: preg_replace_callback(): Unknown modifier ']' in c:\apache\htdocs\test2.php on line 9

    Verwendet PHP da einen anderen RegEx-Engine???

    ~code_pilot



  • http://img464.imageshack.us/img464/1660/clipboard27kl.jpg

    Anwendung in Perl:

    $test = q~This is a 'Hello World' test with two strings 'Regular Expression' blubb!~;
    while($test =~ /'([^']+)'/[b]g[/b]) {
    	print "$1\n";
    }
    

    Ausgabe:
    Hello World
    Regular Expression

    Wieso verwendest du PHP? 😉



  • sarfuan schrieb:

    Wieso verwendest du PHP?

    Ganz einfach: Weil ich Perl nicht mag! :p

    Aber: Es geht!

    Kann mich jetzt bitte noch einer über den Sinn und Zweck der Slashes aufklären??

    Danke
    ~cp 🙂



  • Die gehören zum Aufruf:
    m/regex/modifiers
    m steht für match (kann weggelassen werden siehe vorigen Beitrag); regex ist der Reguläre Ausdruck und modifiers für äh Optionen wie i für "case-insensitive" (also Groß/Kleinschreibung ist egal) und g für "global" (die Suche wird iteriert). Ersetzen geht übrigens mit s/regex/neuer_text/modifiers.
    Ach und wenn ich schon dabei bin, die runden Klammern speichern Teile vom erkannten Ausdruck. Der Inhalt der ersten Klammer ist als $1 verfügbar, der der zweiten als $2, usw.



  • g für greedy oder?



  • G steht für Global. Für die Greedyness ist das '?' verantwortlich...



  • fraage schrieb:

    g für greedy oder?

    Nö, wie sarfuan schrieb, steht das g für global, was in diesem Zusammenhang hier bedeutet, dass in der Schleife bei einem Vergleich an der Position des letzten Treffers mit einer neuen Suche begonnen wird, man iteriert also über die gefundenen Strings. Bei

    $test =~ /'([^']+)'/

    wird ja nur der erste Treffer gesucht, ohne das g würde bei jeder Schleifeniteration der erste String gefunden werden => Endlosschleife.
    Das "greedy" ist ja hier durch [^']+ entschärft (suche nach mindestens 1 oder mehr Zeichen, die nicht ' sind).
    Für non-greedy kann man Perl z.B. ? benutzen:

    @strings = $test =~ /'(.+?)'/g;
    print "@strings";

    (da hier alle Treffer einem Array zugewiesen werden, kann man sich die Schleife sparen)

    MfG



  • Ah vielen dank!

    s/regex/neuer_text/g

    kenne ich schon von vi her.

    Vielen Dank für Eure Hilfen! 😃

    ~cp


Anmelden zum Antworten