Ich brauche einen regulären Perl-Ausdruck, um eine Zeichenfolge abzugleichen. Ich gehe nur von doppelten Anführungszeichen aus, dass ein\"ein buchstäbliches Anführungszeichen und NICHT das Ende der Zeichenfolge ist, und dass\ein literaler Backslash-Zeichen ist und einem Anführungszeichen nicht entgehen sollte Beispiele:
"\"" # string is 1 character long, contains dobule quote
"\\" # string is 1 character long, contains backslash
"\\\"" # string is 2 characters long, contains backslash and double quote
"\\\\" # string is 2 characters long, contains two backslashes
Ich brauche einen regulären Ausdruck, der alle vier dieser Möglichkeiten und alle anderen einfachen Variationen dieser Möglichkeiten als gültige Zeichenfolgen erkennt. Was ich jetzt habe, ist:
/".*[^\\]"/
Aber das ist nicht richtig - es passt zu keinem von denen außer dem ersten. Kann mir jemand einen Push in die richtige Richtung geben, wie ich damit umgehen soll?
Wie wäre es damit?
/"([^\\"]|\\\\|\\")*"/
entspricht null oder mehr Zeichen, die keine Schrägstriche sind, oder Anführungszeichen OR, zwei Schrägstriche OR
/"(?:[^\\"]|\\.)*"/
Dies entspricht fast der Antwort von Cal, hat jedoch den Vorteil, dass Zeichenfolgen mit Escape-Codes wie \n
abgeglichen werden.
Die Zeichen ?:
sollen verhindern, dass der enthaltene Ausdruck als Rückverweis gespeichert wird. Sie können jedoch entfernt werden.
Eine generische Lösung (passend zu allen umgekehrten Zeichen):
/ \A " # Start of string and opening quote
(?: # Start group
[^\\"] # Anything but a backslash or a quote
| # or
\\. # Backslash and anything
)* # End of group
" \z # Closing quote and end of string
/xms
Siehe Text :: Balanced . Es ist besser als Rad neu zu erfinden. Verwenden Sie gen_delimited_pat
, um das Ergebnismuster anzuzeigen und zu lernen, wie es erstellt wird.
Hier ist ein sehr einfacher Weg:
/"(?:\\?.)*?"/
Denken Sie daran, wenn Sie einen solchen Regex in eine Zeichenfolge einbetten, um die Backslashes zu verdoppeln.
RegExp :: Common ist ein weiteres nützliches Werkzeug, das Sie kennen sollten. Es enthält reguläre Ausdrücke für viele häufige Fälle, einschließlich zitierter Zeichenfolgen:
use Regexp::Common;
my $str = '" this is a \" quoted string"';
if ($str =~ $RE{quoted}) {
# do something
}
Versuchen Sie diesen Code: (\".+")