Maison  >  Article  >  interface Web  >  Mode_regular JavaScript sur une seule ligne

Mode_regular JavaScript sur une seule ligne

微波
微波original
2017-06-28 13:39:131210parcourir

Cet article présente principalement l'expression régulière de JavaScript qui dispose également d'un mode sur une seule ligne. Les amis qui en ont besoin peuvent se référer à

Expression régulière en premier. écrit par Ken Thompson dans Implémenté dans son éditeur QED amélioré en 1970, le métacaractère "." le plus simple des expressions régulières à cette époque correspondait à n'importe quel caractère à l'exception des sauts de ligne :

"." expression régulière qui correspond à n'importe quel caractère sauf 5563c1593a3ac6eb1677af49676ec1ed.

La phrase ci-dessus provient du document officiel de QED en 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 :

1,$s#//.*##

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.

Contrairement à Node, où lire un fichier implique généralement de lire le fichier entier en une seule fois, Perl hérite de la tradition de nombreuses commandes Linux lisant les fichiers ligne par ligne, comme ceci :

while (a8093152e673feb7aba1828c43532094) {print $_}
_, 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. Ses expressions régulières doivent correspondre non seulement au texte sur une seule ligne, mais également au texte sur plusieurs lignes. Par conséquent, dans ses expressions régulières, il y a un "." besoin de correspondance croisée, Perl a donc 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 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. 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. 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. 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 est appris de Python et Java, et 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) :

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 encore une fois : Multi-. le contrôle du mode ligne correspond aux performances de ^ et $, le mode ligne unique contrôle les performances de "." et 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 : "." 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.

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