Regular Expressions...



  • 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