An einen Regulärern-Ausdrucks-Checker !!!
Micha
- perl
Sehr geehrter Checker, bitte helfe mir!
Eigentlich dachte ich, daß ich mich mit Regulären-Ausdrücken ganz gut auskenne, doch jetzt läßt mich dieses kurze Skript verzweifeln:
#!/usr/bin/perl
$Test="(Hallo)";
$Test2="(Ha";
$Test=~s/$Test2//;
print $Test;
Ich möchte einfach, daß aus "(Hallo)" das "(Ha" entfernt wird. Leider wird die öffnende Klammer in $Test2 nicht als normales Zeichen interpretiert. Daher kommt es zu dem Fehler, da ja die schließende Klammer fehlt. Dies kann man auch gut nachvollziehen, wenn man in $Test2 "(Hallo)" schreibt, da dann als Endergebnis nicht wie gewünscht $Test="" produziert wird, sondern $Test="()".
Was muß ich machen, damit die Klammer praktisch wie ein Buchstabe behandelt wird.
Ciao
Micha
$Test2="(Ha";
Was muß ich machen, damit die Klammer praktisch wie ein Buchstabe behandelt wird.
Escapen:
$Test2="(Ha";
Danke für Dein Posting!
Das mit dem Escapen habe ich auch schon ausprobiert, funktioniert aber leider nicht.
Außerdem stammt der Inhalt aus $Test2 in meinem praktischem Beispiel aus einer langen extdatei, wo vor den Klammer #natürlich eh kein "" steht.
Hoffe auf weitere Hilfe!
Ciao
Micha
Das mit dem Escapen habe ich auch schon ausprobiert, funktioniert aber leider nicht.
Sorry, mein Fehler (zu schnell).
Wenn Dein String in "" eingeschlossen ist, dann wird der "" bereits dort evaluiert.
Also entweder "\(Ha" oder '(Ha'.
Außerdem stammt der Inhalt aus $Test2 in meinem praktischem Beispiel aus einer langen extdatei, wo vor den Klammer #natürlich eh kein "" steht.
Dann mußt Du ihn dynamisch einfügen, beispielsweise mit
$Test2 =~ s/(/\(/g;
(das ist der Rundumschlag ;-).
Dasselbe natürlich ggf. auch mit allen anderen regexp-Metazeichen - ich empfehle Dir, dafür eine Funktion zu schreiben.
Vielen Dank Michael Schröpel!
Jetzt funktioniert es endliche so, wie ich es will !!! *breitgrins*
Ich habe jetzt auch eine Funktion geschrieben, um alle regexp-Metazeichen zu ersetzen. Ist meine Funktion vollständig und auch "sinnvoll" programmiert?
Was mir nicht ganz klar ist: Warum muß ich in der Zeile "$Test2=~s/($RegExp)/\$1/g;" $1 schreiben und kann nicht statt dessen nochmal $RegExp schreiben?
Ciao
Micha
#!/usr/bin/perl
$Test="+*.^$[(Hallo)";
$Test2="*.^$[(Ha";
@RegExpMeta= ('\', '.', '?', '*', '+', '^', '$', '', '(', ')', '[', ']', '{', '}');
for (@RegExpMeta)
{
$RegExp='\'.$_;
$Test2=~s/($RegExp)/\$1/g;
#print "$RegExp\t$Test2\n";
}
$Test=~s/$Test2//;
print $Test;
Hallo Micha
Ich habe jetzt auch eine Funktion geschrieben, um alle regexp-Metazeichen zu ersetzen. Ist meine Funktion vollständig
Ja!
und auch "sinnvoll" programmiert?
Nein, es ist sinnvoller, die regexp-Metazeichen in einem Durchgang zu ersetzen:
$string =~ s/([\$*+.?^|()[]{}])/\$1/g;
Was mir nicht ganz klar ist: Warum muß ich in der Zeile "$Test2=~s/($RegExp)/\$1/g;" $1 schreiben und kann nicht statt dessen nochmal $RegExp schreiben?
Im Ersetzstring werden keine Metazeichen interpretiert, daher werden bei deinem Beispiel gleich zwei \ eingefügt. Du kannst natürlich "$Test2=~s/$RegExp/$RegExp/g;" schreiben, dann funktioniert's.
Gruss
Andreas