Maison  >  Article  >  interface Web  >  Qu’est-ce que le mode monoligne ? Explication détaillée du mode JavaScript régulier sur une seule ligne

Qu’est-ce que le mode monoligne ? Explication détaillée du mode JavaScript régulier sur une seule ligne

零下一度
零下一度original
2017-04-21 10:20:351431parcourir

Cet article présente principalement les expressions régulières JavaScript qui ont également un mode sur une seule ligne. Les amis qui en ont besoin peuvent s'y référer

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 Le métacaractère le plus simple de l'expression régulière "." correspondait à ce moment-là à n'importe quel caractère à l'exception du caractère de nouvelle ligne :

"." La phrase ci-dessus provient du document officiel du QED de 1970, qui pourrait être le premier document régulier de l'histoire.

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 :

Si "." peut correspondre au caractère de nouvelle ligne, alors la nouvelle ligne Le caractère sera également supprimé, entraînera la fusion de ces lignes avec la ligne suivante, ce qui n'est généralement pas ce que nous voulons. Par conséquent, "." a été conçu pour ne pas correspondre aux nouvelles lignes 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.
1,$s#//.*##

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 :

_ Il y a aussi un caractère de nouvelle ligne à la fin, donc Perl hérite naturellement de la règle de QED selon laquelle "." 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.
while (a8093152e673feb7aba1828c43532094) {print $_}

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 plus clairement, les trois lignes de texte suivantes

sont considérées comme "1n2n3n" une ligne de texte. C'est ce que signifie le mode sur une seule ligne.
1
2
3

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. sous forme de lignes multiples ", ce modèle a été inclus dans le code JavaScript standard depuis l'Antiquité. Le "multiligne" 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 défaut, c'est-à-dire que la chaîne est toujours considérée comme une seule ligne, vous pouvez la faire correspondre 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é, il a donc appelé le mode de "." correspondant aux 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. 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 monoligne et expliqué que le nom du mode monoligne n'avait pas été bien choisi. La V8 a récemment implémenté une proposition ES de phase 3 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 de Python et Java. Le modificateur est hérité de Perl, et il n'est pas nécessaire d'inventer un nouveau modificateur tel que /d, 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) :


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 être confus lorsqu'ils apprennent ce nouveau mode. Permettez-moi de clarifier à nouveau : le mode multiligne contrôle les performances de ^ et $, et le mode monoligne contrôle les performances de ".". Il n'y a pas de relation directe entre les deux.
/foo/s.dotAll // true
/^.{4}$/s.test("\n\r\u2028\u2029") // true

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 : "." correspondra au caractère de nouvelle ligne par défaut, et N peut correspondre à n'importe quel caractère sauf les nouvelles lignes ; ^ et $ correspondent toujours au début et à la fin de la chaîne, tandis que les deux nouveaux métacaractères ^^ et $$ sont introduits pour correspondre au début et à la fin de la ligne.

Les alternatives au mode monoligne [^] ou [sS] que nous avons utilisées dans le passé ne sont pas totalement inutiles. Par exemple, dans certains éditeurs qui utilisent la régularité JavaScript (VS Code, Atom), il est peu probable qu'elles vous soient fournies. avec la possibilité d'activer l'interface en 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.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn