Maison > Article > interface Web > Explication détaillée du mode régulier sur une seule ligne de JS
Cette fois, je vous apporte une explication détaillée du mode monoligne régulier JS. Quelles sont les précautions lors de l'utilisation du mode monoligne régulier JS. Voici des cas pratiques, jetons un coup d'œil.
L'expression régulière a été implémentée pour la première fois par Ken Thompson dans son éditeur QED amélioré en 1970. Le métacaractère "." le plus simple correspondant à cette époque est n'importe quel caractère à l'exception des caractères de nouvelle ligne :
"." est une expression régulière qui correspond à n'importe quel caractère sauf
La phrase ci-dessus provient du document officiel de QED en 1970, qui pourrait être le premier document régulier de 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 (<>) {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 ce qui est terrible, c'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 plusieurs lignes", ce modèle
JavaScripta été inclus dans les règles régulières 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 dans le milieu d'une chaîne par défaut, c'est-à-dire que l'on pense que la chaîne n'aura toujours qu'une seule ligne et qu'elle pourra être mise en 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é, 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. très bon nom. , et plus tard Java a également utilisé ce nom.
上面回顾了一下历史,解释了下单行模式的由来以及说明了下单行模式这个名字起得不好。V8 最近刚刚实现了一个 stage 3 的 ES 提案 https://github.com/mathiasbynens/es-regexp-dotall-flag,这个提案为 JavaScript 的正则引入了 /s 修饰符和 dotAll 属性,dotAll 属性是学了 Python 和 Java,/s 修饰符是继承了 Perl 的,这里也没必要发明一个新的修饰符比如 /d,只会让事情更复杂。/s 在 JavaScript 的具体效果是让 “.” 能匹配以前不能匹配的四个行终止符:\n(换行)、\r(回车)、\u2028(行分隔符)、\u2029(段落分隔符):
/foo/s.dotAll // true /^.{4}$/s.test("\n\r\u2028\u2029") // true
其实就是个很简单的东西,但可能一些没有接触过 JavaScript 以外的正则的同学到时候学到这个新的模式后会产生困惑,这里再澄清一下:多行模式控制的是 ^ 和 $ 的表现,单行模式控制的是 “.” 的表现,两者没有直接关系。
然而当初引入单行模式和多行模式这两个易混淆概念的 Perl 语言,已经在 Perl 6 中完全删除了这两个模式:“.” 号默认就匹配换行符,\N 可以匹配换行符除外的任意字符;^ 和 $ 始终匹配字符串的首尾,而新引入了 ^^ 和 $$ 两个元字符来匹配行的首尾。
过去我们常用的单行模式的替代品 [^] 或者 [\s\S] 也不是完全没有用了,比如在一些使用 JavaScript 正则的编辑器里(VS Code、Atom),不太可能给你提供开启单行模式的界面。不过说起编辑器里的正则功能,用 JavaScript 实现的编辑器的正则功能还是太弱了,比如不能在正则自身内部开启某些模式,比如要是在 Sublime(使用 Python 正则)里的话,在正则内部使用 (?s) 就能开启 dotall 模式,比如可以用 (?s)/\*.+?\*/ 匹配到所有的多行注释。
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
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!