web-dev-qa-db-fra.com

Comment puis-je associer des chaînes entre guillemets doubles et des guillemets doubles échappés?

J'ai besoin d'une expression régulière Perl pour correspondre à une chaîne. Je suppose seulement les chaînes entre guillemets, qu'un\"est un caractère de citation littéral et NON la fin de la chaîne, et qu'un\est un caractère de barre oblique inverse littérale et ne doit pas échapper à un caractère de citation. Si ce n'est pas clair, certains exemples:

"\""    # 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

J'ai besoin d'une expression régulière capable de reconnaître ces 4 possibilités, ainsi que toutes les autres variantes simples de ces possibilités, en tant que chaînes valides. Ce que j'ai maintenant, c'est:

/".*[^\\]"/

Mais ce n'est pas correct - cela ne correspond à aucun de ceux-ci sauf le premier. Quelqu'un peut-il me donner un coup de pouce dans la bonne direction sur la façon de gérer cela?

31
Chris Lutz

Que dis-tu de ça?

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

correspond à zéro ou plusieurs caractères qui ne sont pas des barres obliques ou des guillemets OR deux barres obliques OR une barre oblique puis une citation

26
Cal

Une solution générique (correspondant à tous les caractères anti-slashés):

/ \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

Voir Texte :: Équilibré . C'est mieux que de réinventer la roue. Utilisez gen_delimited_pat pour voir le résultat et apprendre à le former.

5

Voici un moyen très simple:

/"(?:\\?.)*?"/

N'oubliez pas que si vous intégrez une telle expression rationnelle dans une chaîne, vous doublez les barres obliques inverses.

1
Boann

RegExp :: Common est un autre outil utile à connaître. Il contient des expressions rationnelles pour de nombreux cas courants, y compris des chaînes entre guillemets:

use Regexp::Common;

my $str = '" this is a \" quoted string"';
if ($str =~ $RE{quoted}) {
  # do something
}
1
Rob Van Dam

Essayez ce morceau de code: (\".+")

0
Nikul