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