2009-07-10 9 views
4

Erstens habe ich mich gefragt, ob es eine Art eingebaute Funktion gab, die prüfen sollte, ob ein Regex-Muster gültig war oder nicht. Ich möchte nicht überprüfen, ob der Ausdruck funktioniert - ich möchte nur überprüfen, ob die Syntax des Musters gültig ist - wenn das möglich ist.Wie kann ich überprüfen, ob ein Regex-Muster in Perl gültig ist?

Wenn es keine integrierte Funktion dafür gibt, wie mache ich das alleine? Muss ich überhaupt?

Gibt es ein Verzeichnis von eingebauten Funktionen/Modulen, die ich durchsuchen kann, um weitere Fragen wie diese zu vermeiden? Vielen Dank.

BEARBEITEN: Ich sollte erwähnen, dass ich plane, diese Muster auf der Grundlage von Benutzereingaben zu generieren - weshalb ich sie überprüfen möchte, um sicherzustellen, dass sie tatsächlich ausgeführt werden.

Antwort

20

Ich bin kein Experte Perl, aber vielleicht this helfen:

#!/usr/bin/perl 

my $pattern = "["; # <-insert your pattern here 
my $regex = eval { qr/$pattern/ }; 
die "invalid regex: [email protected]" if [email protected]; 

, die diese zurück:

invalid regex: Unmatched [ in regex; marked by <-- HERE in m/[ <-- HERE/at test.pl line 4. 

Für Ihre zweite Frage, die Sie immer auf CPAN die riesige Menge an Arbeit austesten sollte .

+2

Wenn dies für einen Server ist, überlegen Sie sehr genau, wie Sie verhindern, dass die vom Benutzer generierten Eingaben beliebigen Code ausführen. Ich weiß nicht, wie es passieren könnte, aber das ist keine Garantie. –

+0

@George: Das ist ein sehr guter Punkt, danke für das Erwähnen. – bernie

+1

Ich war heute an der Grenze, und das Perl-Kochbuch vorgeschlagen Eval auch. – radicalmatt

2

Ich bin nicht ganz sicher, was Sie mit "gültig" hier meinen. Wenn der Ausdruck syntaktisch nicht korrekt ist (zB wenn eine Klammer fehlt), wird der Interpreter Sie darüber informieren und Ihr Programm wird nicht kompiliert.

Aber das schützt Sie nicht vor logischen oder semantischen Fehlern. Das heißt, Ihr regulärer Ausdruck mag zwar Perl sein, aber schreckliche Dinge - oder gar nichts tun. Vielleicht möchten Sie etwas wie YAPE::Regex::Explain, das eine Erklärung Ihres regulären Ausdrucks erzeugt.

Verwandte Themen