• 脚本之家
  • 软件下载
    android软件 MAC软件 驱动下载 字体下载 DLL下载
  • 源码下载
    asp源码 php源码 asp.net源码 jsp源码 网页编辑器 数据库管理 常用组件 脚本下载
  • 在线工具
    在线手册 CSS格式化 JS格式化 Html转化为Js js正则表达式
  • 网页教程基础
  • 服务器常用软件
  • 手机版
  • 关注微信
脚本之家
  • 网页制作
  • 网络编程
  • 脚本专栏
  • 脚本下载
  • 数据库
  • CMS教程
  • 电子书籍
  • 平面设计
  • 媒体动画
  • 操作系统
  • 网站运营
  • 网络安全
  • 在线手册
  • JavaScript
  • ASP.NET
  • PHP编程
  • AJAX相关
  • 正则表达式
  • ASP编程
  • JSP编程
  • 编程10000问
  • CSS/HTML
  • Flex
  • 脚本加解密
  • web2.0
  • XML/RSS
  • 网页编辑器
  • 相关技巧
  • 安全相关
  • 网页播放器
  • 其它综合
  • Dart
您的位置:首页 → 网络编程 → 正则表达式 → 正文内容 正则也有单行模式

JavaScript的正则也有单行模式了

作者:紫云飞 字体:[增加 减小] 类型:转载 时间:2017-04-07 我要评论

这篇文章主要介绍了JavaScript的正则也有单行模式了,需要的朋友可以参考下

正则表达式最早是由 Ken Thompson 于 1970 年在他改进过的 QED 编辑器里实现的,正则里最简单的元字符 “.” 在当时所匹配的就是除换行符外的任意字符:

"." is a regular expression which matches any character except <nl>.

上面这句话出自 QED 在 1970 年的官方文档,这可能是史上第一份正则文档。

为什么要这么规定?是因为 QED 是以行为单位来编辑文件的,而且行尾的换行符也算在这一行的内容里。比如你想把一段代码中所有的单行注释删掉,在 QED 里可以用下面这句命令: 

1,$s#//.*##

如果 “.” 能匹配到换行符,那么换行符也会被删除,会导致这些行和它的下一行合并,这通常都不是我们想要的结果,所以,“.” 在最初发明时被设计成了不能匹配换行符。虽然现在的操作系统上已经没有 QED 命令让我们测试了,但我们还有 VIM,VIM 里的 “.” 也一样不能匹配换行符,因为同样的原因。

不像在 Node 中,读取文件通常是一股脑读完整个文件,Perl 继承了众多 Linux 命令按行读取文件的传统,像这样:

while (<>) {print $_}

_ 的末尾也有换行符,所以 Perl 也就很自然的继承了 QED 的 “.” 不匹配换行符的规定。但 Perl 毕竟是门编程语言,而不是编辑器,它的正则要匹配的对象不单单会是单行文本,还可能是多行文本,因此在它的正则中,“.” 有跨行匹配的需求,因此 Perl 发明了正则的单行模式 /s,即让 “.” 也能匹配换行符。

Perl 中用来打开单行模式的 /s 修饰符的官方描述是 “Treat the string as single line”,这个 “single line” 要这么理解:“.” 在普通模式下只能匹配行内字符,不能跨行;而在单行模式下,Perl 会假装把多行字符串看成一行,把其中的换行符看做是行内字符,所以 “.” 也就能匹配它们了。更形象点说,就是把下面的三行文本

1
2
3

看成 "1\n2\n3\n" 一行文本,单行模式就是这个意思。

但要命的是,因为同样的原因(字符串变量可以包含多行文本),Perl 还发明了 /m 修饰符,即多行模式,官方描述是 “Treat the string as multiple lines”,这个模式 JavaScript 的正则里自古也有,这里这个“多行”的意思是说:^ 和 $ 元字符默认不会匹配一个字符串中间的那些换行符前后的位置,即认为字符串永远只有一行,打开多行模式后就能匹配了。

也就是说,单行模式和多行模式是针对不同的元字符的,刚接触正则的人都会被“单行模式”和“多行模式”这两个看似是相对应的概念,实则毫无关联的名词给搞晕。

后来,Ruby 的作者可能觉得“单行模式”这个正则术语起的不好,特例独行把让 “.” 匹配换行符这一模式称之为“多行模式”,即让 .* 之类的正则能够匹配多行了,所以也完全讲得通,修饰符也用了 /m(Ruby 中默认会开启 Perl 中的“多行模式”,所以 /m 没被占用),这真是雪上加霜,更乱了。 

再后来,Python 作者可能也觉得应该避免“单行模式”这个叫法,于是起了个新的名字 “dotall”,也就是让 dot 能匹配所有字符的意思,很好的名字,再后来 Java 也使用了这个名字。

上面回顾了一下历史,解释了下单行模式的由来以及说明了下单行模式这个名字起得不好。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)/\*.+?\*/ 匹配到所有的多行注释。

Tags:正则 单行模式

相关文章

  • 2015-10-10日常收集整理php正则表达式(超常用)
  • 2006-06-06JScript中正则表达函数的说明与应用
  • 2011-08-08正则表达式之捕获组/非捕获组介绍
  • 2009-10-10javascript RegExp 对象属性与方法和应用
  • 2008-08-08asp.net常用正则表达式
  • 2007-04-04JS:正则将首字单词转成大写
  • 2016-10-10jQuery验证手机号邮箱身份证的正则表达式(含港澳台)
  • 2006-12-12一个关于正则表达式的问题
  • 2015-10-10正则表达式详细介绍(上)
  • 2008-06-06asp正则过滤重复字符串的代码

最新评论

大家感兴趣的内容

  • 1Java 正则表达式详解
  • 2正则表达式匹配任意字符(包括换
  • 3javascript 手机号码正则表达式验
  • 4比较正宗的验证邮箱的正则表达式
  • 5js正则函数match、exec、test、s
  • 6grep用法详解 grep与正则表达式
  • 7正则中需要转义的特殊字符小结
  • 8JS利用正则配合replace替换指定字
  • 9正则表达式匹配不包含某些字符串
  • 10PHP preg_replace() 正则替换所有

最近更新的内容

    • 正则表达式常用元字符整理小结
    • 正则表达式笔记三则
    • python 正则表达式 反斜杠(/)的麻烦和陷阱
    • 又一不错的应用-正则来查找替换字符串
    • 截字符串 去除HTML标记
    • 正则表达式口诀_学习正则的朋友值得一看
    • javascript高级程序设计(第三版)学习笔记
    • 详解js正则表达式语法介绍
    • 代替正则——HyperScriptExpression联合开
    • 关于preg_replace函数的问题讲解

常用在线小工具

关于我们 - 广告合作 - 联系我们 - 免责声明 - 网站地图 - 投诉建议 - 在线投稿

©CopyRight 2006-2017 JB51.Net Inc All Rights Reserved. 脚本之家 版权所有

  • navicat for mysql图形化管理工具 v11.2.15 64bit 简体中文免费版 下载-脚本之家

  • sybase powerbuilder 12.5 官方正式破解版(powerbuilder 12.1完美破解补丁) 下载-脚本之家

  • 推荐一款mysql图形管理工具navicat 8.2中文免费版 下载-脚本之家

  • 数据库_软件下载 - 脚本之家

  • mssql2008 正式版 sql server 2008 r2 64位32位 下载-脚本之家

  • sybase powerdesigner v12.5 特别破解版 下载-脚本之家

  • powerdesigner下载 power designer v15.1 汉化破解版 下载-脚本之家

  • navicat破解版下载 navicat11注册机(navicat11全系列注册机) 中文绿色版 下载-脚本之家

  • mysql图形工具 mysql gui tools 5.0 附中文汉化包 下载-脚本之家

  • display和visibility的区别_css教程_css_网页制作_脚本之家

  • css 文本字体颜色设置方法(css color)_css教程_css_网页制作_脚本之家

  • 总结30个css3选择器 _css3_css_网页制作_脚本之家

  • 不定宽高的文字在div中垂直居中实现方法_div+css教程_css_网页制作_脚本之家

  • css3制作hover下划线动画_css3_css_网页制作_脚本之家

  • html设置超链接字体颜色和点击后的字体颜色_css教程_css_网页制作_脚本之家

  • div+css实现带箭头的面包屑导航栏_div+css教程_css_网页制作_脚本之家

  • 详解css3中字体平滑处理和抗锯齿渲染_css3_css_网页制作_脚本之家

  • css_网页制作 - 脚本之家

  • css中margin边界叠加问题及解决方案_css教程_css_网页制作_脚本之家

  • css3 仿微信聊天小气泡实例代码_css3_css_网页制作_脚本之家

  • css3动画:5种预载动画效果实例_css3_css_网页制作_脚本之家

  • css控制ul li 的样式详解(推荐)_css教程_css_网页制作_脚本之家

  • div水平垂直居中的完美解决方案_css教程_css_网页制作_脚本之家

  • css中px em rem区别与使用_css教程_css_网页制作_脚本之家

  • css3效果:自定义“w”形运行轨迹实例_css3_css_网页制作_脚本之家