Frage

Ich habe eine harte Zeit zu bestimmen, welche Zeichen muss entwertet werden, wenn Perl qr {} konstruieren

mit

Ich versuche, eine mehrzeilige vorkompilierte regex für Text zu erstellen, die eine Vielzahl von normalerweise Escape-Zeichen enthält (# *>. []) Und enthält auch eine andere vorkompilierte regex. Zusätzlich benötige ich für Testzwecke so streng wie möglich entsprechen.

my $output = q{# using defaults found in .config
*
*
Options:
  1. opt1
> 2. opt2
choice[1-2?]: };

my $sc = qr{(>|\s)}smx;
my $re = qr{# using defaults found in .config
*
*
Options:
$sc 1. opt1
$sc 2. opt2
choice[1-2?]: }mx;

if ( $output =~ $re ) {
  print "OK!\n";
}
else {
  print "D'oh!\n";
}

Fehler:

Quantifier follows nothing in regex; marked by <-- HERE in m/# using defaults found in .config
* <-- HERE 
*
Options:
(?msx-i:(>|\s)) 1. opt1
(?msx-i:(>|\s)) 2. opt2
choice[1-2?]: / at ./so.pl line 14.

Der Versuch, die Sternchen Ergebnisse in einem ausgefallenen Spiel zu entkommen (D'oh-Ausgabe). Der Versuch, andere lästige Zeichen zu entkommen führt auch zu einem ausgefallenen Spiel. Ich fahre fort könnte verschiedene Kombinationen zu versuchen, was zu entkommen, aber es gibt eine Menge von Variationen hier und bin die Hoffnung, jemand einen Einblick bieten könnte.

War es hilfreich?

Lösung

Sie haben das Trennzeichen für qr zu entkommen //, und Sie müssen keine Regex Metazeichen entkommen, die Sie als Literale verwenden möchten. Wenn Sie diejenigen, wörtliche wollen * 's, müssen Sie sie entkommen, da die * ein regulärer Ausdruck quantifier ist.

Ihr Problem hier ist, die verschiedenen Regex-Flags, die Sie hinzugefügt haben. Der / m tut nichts, weil Sie nicht über den Anfangs- verwenden oder End-of-string Anker (^, $). Die / s macht nichts, weil Sie nicht den Platzhalter verwenden. metacharacter. Das / x macht all die Leerzeichen in Ihrem regex bedeutungslos, und es stellt sich die Zeile mit der # in einen regulären Ausdruck Kommentar.

Dies ist, was Sie wollen, mit regex Flags entfernt und die richtigen Dinge entkommen:

my $sc = qr{(>|\s)};

my $re = qr{# using defaults found in \.config
\*
\*
Options:
$sc 1\. opt1
$sc 2\. opt2
choice\[1-2\?]: };

Obwohl Damian Conway sagt der Menschen in Perl Best Practices immer diese Optionen auf ihren regulären Ausdrücke zu setzen, sehen Sie jetzt, warum er falsch ist. Sie sollten sie nur hinzufügen, wenn Sie wollen, was sie tun, und Sie sollten nur Dinge hinzufügen, wenn Sie wissen, was sie tun. :) Hier ist, was Sie tun könnten, wenn Sie / x verwenden möchten. Sie haben keine wörtlichen Leerzeichen zu entkommen, müssen Sie irgendwie die Zeilenende bezeichnen, und Sie haben die wörtlichen Zeichen # zu entkommen. Was lesbar war vor ist jetzt ein Chaos:

my $sc  = qr{(>|\s)};
my $eol = qr{[\r\n]+};

my $re  = qr{\# \s+ using \s+ defaults \s+ found \s+ in \s+ \.config $eol
\*                    $eol
\*                    $eol
Options:              $eol
$sc \s+ 1\. \s+ opt1   $eol
$sc \s+ 2\. \s+ opt2   $eol
choice\[1-2\?]: \s+
}x;

if ( $output =~ $re ) {
  print "OK!\n";
}
else {
  print "D'oh!\n";
}

Andere Tipps

Klingt wie das, was Sie wirklich wollen, ist erwarten , aber das, was Sie sind die meisten sofort suchen, ist die quotemeta Operator, der alle Zeichen entkommt, die eine besondere Bedeutung zu a haben regex.

Um Ihre Frage direkt (aber), zusätzlich zu dem unquote Zeichen (in diesem Fall }) zu beantworten müssen Sie auf einem Minimum zu entkommen, .[$()|*+?{\

Wie brian sagte, müssen Sie die Trennzeichen und Regex Metazeichen entkommen. Beachten Sie, dass, wenn qr//x mit (was Sie sind), können Sie auch Leerzeichen und # entkommen muss (das ist ein Kommentar-Marker). Sie wollen wahrscheinlich nicht wirklich /x hier verwenden. Wenn Sie sicher sein möchten, können Sie auf können entziehen sich jeglicher nicht-alphanumerischen Zeichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top