Cet article présente principalement le mode JavaScript standard et le mode monoligne. Les amis qui en ont besoin peuvent s'y référer. J'espère que cela pourra aider tout le monde.
Les expressions régulières ont été implémentées pour la première fois par Ken Thompson dans son éditeur QED amélioré en 1970. Le métacaractère le plus simple "." dans les expressions régulières à cette époque correspondait à tout sauf aux nouvelles lignes :
. " est une expression régulière qui correspond à n'importe quel caractère sauf
La phrase ci-dessus provient du document officiel du QED de 1970, qui pourrait être le premier document régulier.
Pourquoi y a-t-il une telle règle ? En effet, QED édite les fichiers en unités de ligne et le caractère de nouvelle ligne à la fin de la ligne est également inclus dans le contenu de cette ligne. Par exemple, si vous souhaitez supprimer tous les commentaires sur une seule ligne dans un morceau de code, vous pouvez utiliser la commande suivante dans QED :
1,$s#//.*##
If "." peut Si un caractère de nouvelle ligne correspond, le caractère de nouvelle ligne sera également supprimé, ce qui entraînera la fusion de ces lignes avec la ligne suivante. Ce n'est généralement pas le résultat souhaité. Par conséquent, "." faire correspondre les caractères de nouvelle ligne lors de sa première invention. Bien qu'il n'y ait pas de commande QED sur le système d'exploitation actuel à tester, nous avons toujours VIM et le "." dans VIM ne peut pas correspondre au caractère de nouvelle ligne pour la même raison.
Contrairement à Node, où lire un fichier signifie généralement lire le fichier entier en une seule fois, Perl hérite de la tradition de lire les fichiers ligne par ligne avec de nombreuses commandes Linux, comme ceci :
while (<>) {print $_}
_ a également un caractère de nouvelle ligne à la fin, donc Perl hérite naturellement de la règle "." de QED qui ne correspond pas aux caractères de nouvelle ligne. Mais Perl est après tout un langage de programmation, pas un éditeur. Les objets auxquels ses expressions régulières doivent correspondre ne sont pas seulement des lignes de texte simples, mais peuvent également être des textes sur plusieurs lignes. Par conséquent, dans ses expressions régulières, "." une exigence de correspondance entre lignes. Par conséquent, Perl a inventé le mode /s sur une seule ligne, qui permet également de faire correspondre les caractères de nouvelle ligne.
La description officielle du modificateur /s en Perl utilisé pour activer le mode ligne unique est "Traitez la chaîne comme une seule ligne". Cette "ligne unique" doit être comprise comme ceci : "." en mode normal, les caractères en ligne ne peuvent pas s'étendre sur des lignes ; en mode sur une seule ligne, Perl fera semblant de traiter les chaînes multilignes comme une seule ligne et traitera les caractères de nouvelle ligne comme des caractères en ligne, afin que "." Pour le dire de manière plus vivante, les trois lignes de texte suivantes
1 2 3
sont considérées comme "1n2n3n" une seule ligne de texte. mode signifie.
Mais le plus terrible est que, pour la même raison (les variables de chaîne peuvent contenir plusieurs lignes de texte), Perl a également inventé le modificateur /m, qui est en mode multiligne. La description officielle est "Traitez la chaîne. comme lignes multiples ", ce modèle a été inclus dans les règles JavaScript classiques depuis l'Antiquité. Le "multi-ligne" signifie ici : les métacaractères ^ et $ ne correspondront pas aux positions avant et après les caractères de nouvelle ligne au milieu d'une chaîne par par défaut, ce qui signifie que la chaîne n'aura toujours qu'une seule ligne, vous pourrez faire la correspondance après avoir activé le mode multi-ligne.
En d'autres termes, le mode monoligne et le mode multiligne sont destinés à des métacaractères différents. Les personnes qui débutent dans les expressions régulières seront déroutées par les deux « mode monoligne » et « multiligne » apparemment correspondants. mode". concept, mais en fait, il prête à confusion avec des termes sans rapport.
Plus tard, l'auteur de Ruby a peut-être estimé que le terme habituel "mode monoligne" n'était pas bien utilisé, c'est pourquoi il a appelé le mode de correspondance des caractères de nouvelle ligne "mode multiligne", c'est-à-dire c'est-à-dire que let * et d'autres expressions régulières peuvent correspondre à plusieurs lignes, cela est donc parfaitement logique. Le modificateur utilise également /m (Ruby activera le "mode multiligne" en Perl par défaut, donc /m n'est pas occupé). vraiment Pour ajouter l’insulte à l’injure, c’est encore plus chaotique.
Plus tard, l'auteur de Python a peut-être également estimé que le terme "mode monoligne" devait être évité, il lui a donc donné un nouveau nom "dotall", ce qui signifie que le point peut correspondre à tous les caractères. très bon nom, et plus tard Java a également utilisé ce nom.
Ce qui précède a passé en revue l'historique, expliqué l'origine du mode ligne unique et expliqué que le nom du mode ligne unique n'avait pas été bien choisi. V8 a récemment implémenté une proposition ES de phase 3 https://github.com/mathiasbynens/es-regexp-dotall-flag Cette proposition introduit le modificateur /s et l'attribut dotAll à la régularité JavaScript. L'attribut dotAll est appris en Python et Java. , le modificateur /s est hérité de Perl. Il n'est pas nécessaire d'inventer un nouveau modificateur tel que /d ici, ce qui ne fera que compliquer les choses. L'effet spécifique de /s en JavaScript est de permettre à "." de faire correspondre quatre terminateurs de ligne qui ne pouvaient pas correspondre auparavant : n (saut de ligne), r (retour chariot), u2028 (séparateur de ligne), u2029 (séparateur de paragraphe) :
/foo/s.dotAll // true /^.{4}$/s.test("\n\r\u2028\u2029") // true
En fait, c'est une chose très simple, mais certains étudiants qui n'ont pas été exposés à des expressions régulières autres que JavaScript peuvent apprendre ce nouveau mode dans le temps. En cas de confusion, permettez-moi de clarifier à nouveau : le mode multiligne contrôle les performances de ^ et $, et le mode monoligne contrôle les performances de ".".
Cependant, le langage Perl, qui a initialement introduit les concepts déroutants de mode monoligne et de mode multiligne, a complètement supprimé ces deux modes dans Perl 6 : "." correspond aux caractères de nouvelle ligne par défaut, et N peut correspondre aux caractères de nouvelle ligne. caractères. Tout caractère sauf ; ^ et $ correspond toujours au début et à la fin de la chaîne, tandis que les deux métacaractères nouvellement introduits ^^ et $$ correspondent au début et à la fin de la ligne.
Les alternatives au mode monoligne [^] ou [sS] que nous utilisions couramment dans le passé ne sont pas totalement inutiles. Par exemple, dans certains éditeurs qui utilisent la régularité JavaScript (VS Code, Atom), c'est le cas. il est peu probable que vous fournissiez une interface pour activer le mode monoligne. Cependant, en parlant de la fonction normale de l'éditeur, la fonction normale de l'éditeur implémentée en JavaScript est encore trop faible. Par exemple, certains modes ne peuvent pas être activés dans le code normal lui-même, par exemple s'il est dans Sublime (en utilisant). Code normal Python), à l'intérieur du code normal, utilisez (?s) pour activer le mode dotall. Par exemple, vous pouvez utiliser (?s)/*.+?*/ pour faire correspondre tous les commentaires multilignes. ,
Recommandations associées :
Application des expressions régulières JavaScript
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!