webentwicklung-frage-antwort-db.com.de

Wie kann ich doppelte Anführungszeichen mit doppelten Anführungszeichen kombinieren?

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?

31
Chris Lutz

Wie wäre es damit?

/"([^\\"]|\\\\|\\")*"/

entspricht null oder mehr Zeichen, die keine Schrägstriche sind, oder Anführungszeichen OR, zwei Schrägstriche OR

26
Cal

/"(?:[^\\"]|\\.)*"/

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.

41
j_random_hacker

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
9
Leon Timmermans

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.

1
Boann

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
}
1
Rob Van Dam

Versuchen Sie diesen Code: (\".+")

0
Nikul