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



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow