Regular Expressions
Regex Pitfalls
Recherche…
Pourquoi le point (.) Ne correspond-il pas au caractère de nouvelle ligne ("\ n")?
.*
dans regex signifie en gros "attraper tout jusqu'à la fin de la saisie".
Donc, pour les chaînes simples, comme hello world
.*
Fonctionne parfaitement. Mais si vous avez une chaîne représentant, par exemple, des lignes dans un fichier, ces lignes seraient séparées par un séparateur de ligne , tel que \n
(nouvelle ligne) sur les systèmes de type Unix et \r\n
(retour chariot et nouvelle ligne) sur Les fenêtres.
Par défaut , dans la plupart des moteurs regex, .
ne correspond pas aux caractères de nouvelle ligne, donc la correspondance s'arrête à la fin de chaque ligne logique . Si vous voulez .
pour correspondre vraiment tout, y compris les nouvelles lignes, vous devez activer « dot-Correspondances- tous » mode dans votre moteur de regex de choix (par exemple, ajouter re.DOTALL
drapeau en Python ou /s
dans PCRE.
Pourquoi une regex ignore-t-elle certaines parenthèses / parenthèses et les fait correspondre par la suite?
Considérez cet exemple:
Il entra dans le café "Dostoevski" et dit: "Bonsoir".
Nous avons ici deux jeux de citations. Supposons que nous voulions faire correspondre les deux, de sorte que notre regex corresponde à "Dostoevski"
et "Good evening."
Au début, vous pourriez être tenté de rester simple:
".*" # matches a quote, then any characters until the next quote
Mais ça ne marche pas: cela correspond à la première citation dans "Dostoevski"
et jusqu'à la citation finale dans "Good evening."
, y compris le and said:
part. Regex101 démo
Pourquoi est-ce arrivé?
Cela se produit parce que le moteur de regex, quand il rencontre .*
, "Mange" toutes les entrées à la fin. Ensuite, il doit correspondre à la finale "
. Donc, il" recule "à partir de la fin du match, lâchant le texte correspondant jusqu'à ce que le premier "
soit trouvé - et, bien sûr, le dernier "
du match. , à la fin de la partie "Good evening."
.
Comment empêcher cela et correspondre exactement aux premiers guillemets?
Utilisez [^"]*
. Il ne mange pas toutes les entrées - seulement jusqu'au premier "
, juste au besoin. Regex101 démo