本节书摘来自异步社区《正则表达式经典实例(第2版)》一书中的第2章,第2.18节,作者: 【美】Jan Goyvaerts , Steven Levithan著,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.18 向正则表达式中添加注释

问题描述
‹d{4}-d{2}-d{2}›可以匹配一个yyyy-mm-dd形式的日期,但是不会对数字做任何检查。当你知道数据中不会包含非法日期时,这样一个简单的正则表达式就够用了。试着在该正则表达式中添加注释来说明该正则表达式的每个部分的含义。

解决方案

\d{4}   # Year
-        # Separator\d{2}   # Month
-        # Separator\d{2}   # Day
正则选项:宽松排列
正则流派:.NET、Java、XRegExp、PCRE、Perl、Python、Ruby

讨论
宽松排列模式
正则表达式很容易变得复杂无比并且难以理解。源代码中应该添加注释,所以只要正则表达式稍微复杂一点,你也应该在其中添加注释。

本书中除了JavaScript之外的所有正则表达式流派,都提供了某种形式的正则表达式语法来帮助你很容易清晰地注释正则表达式。你可以通过开启宽松排列(free-spacing)模式来应用这种语法。在不同的编程语言中它可能会有不同的名称。

在.NET中,需要设置RegexOptions.IgnorePatternWhitespace选项。而在Java中,则要传递Pattern.COMMENTS标志。Python用的是re.VERBOSE。PHP、Perl和Ruby则使用/x标志。

尽管标准JavaScript并不支持宽松排列,但XRegExp库添加了这个选项。只需在XRegExp()构造器第二个参数标志中添加'x'即可。

打开宽松排列模式会产生两个效果。首先,它会把位于字符组之外的井号(#)转变成一个元字符。井号会作为一个注释的开始,该注释的结尾是一行的结束或者该正则表达式的结束(取二者中先到的那个)。井号以及其后的所有内容都会被正则表达式引擎直接忽略。如果要匹配一个字面上的井号字符,必须把它放到一个字符组‹[#]›中,或者把它转义为‹#›。

宽松排列模式的另外一个效果是:位于字符组之外的所有空白字符,包括空格、制表符和换行符,都会被忽略。要想匹配一个字面上的空格,就需要把它放到字符组‹[●]›中,或者把它转义为‹●›。如果你更关心可读性的话,那么也可以选择使用十六进制数的转义形式‹x20›,或者是Unicode转义形式‹u0020›或‹x{0020}›来代替。如果要匹配一个制表符,则应该使用‹t›。至于换行符,则可以使用‹rn›(Windows)或者‹n›(Unix、Linux、OS X)。

宽松排列模式并不会改变位于字符组之内的任何内容。一个字符组可以看作是单个记号。位于字符组之内的任意空白字符或者井号都是被添加到字符组中的字面字符。打断字符组来对其中的某个部分进行注释是不允许的。

Java中的宽松排列字符组
如果完全不存在与其他不兼容的流派,正则表达式的复杂性也不会让人谈之生变。在这里,不兼容的那个流派就是Java。

在Java中,字符组并不作为单个记号来进行分析。如果你打开了宽松排列模式,那么Java就会忽略字符组中的空格,而且在字符组中的井号也意味着注释的开始。这就意味着,你不能使用‹[●]›和‹[#]›来字面匹配这些字符。使用‹u0020›和‹#›作为替代。

变体

(?#Year)\d{4}(?#Separator)-(?#Month)\d{2}-(?#Day)\d{2}
正则选项:无
正则流派:.NET、XRegExp、PCRE、Perl、Python、Ruby

不管是出于什么原因,如果你不能或者是不想使用宽松排列语法,那么还可以通过‹(?#comment)›的方式添加注释。在‹(?#›和‹)›之间的所有字符都会被忽略。

不幸的是,JavaScript,也就是本书中讲到的流派中唯一不支持宽松排列的流派,同样也不支持这种注释语法。XRegExp为JavaScript添加了宽松排列支持,同样也添加了这种注释语法支持。而Java支持宽松排列模式下添加注释,却不支持‹(?#comment)›这种语法。

(?x)\d{4}   # Year
-              # Separator\d{2}         # Month
-              # Separator\d{2}         # Day
正则选项:无
正则流派:.NET、Java、XRegExp、PCRE、Perl、Python、Ruby

如果不能在正则表达式之外启用宽松排列模式,那么你可以把模式修饰符‹(?x)›放到正则表达式的最开始处。确保‹(?x)›之前不存在任何空格。因为只有在这个模式修饰符之后才会开始宽松排列模式,因此在它之前的任意空格都是不能忽略的。

《正则表达式经典实例(第2版)》——2.18 向正则表达式中添加注释相关推荐

  1. PHP经典实例(第二版) php实例大全

    查看书籍详细信息: PHP经典实例(第二版) 编辑推荐 "这本书中的每个实例都自成一体.多数情况下,我都能从中找到符合实际需要的例子." --Edmond Lau,Slashdot ...

  2. 《正则表达式经典实例(第2版)》——2.19 在替代文本中添加字面文本

    本节书摘来自异步社区<正则表达式经典实例(第2版)>一书中的第2章,第2.19节,作者: [美]Jan Goyvaerts , Steven Levithan著,更多章节内容可以访问云栖社 ...

  3. 《正则表达式经典实例(第2版)》——2.6 匹配完整单词

    本节书摘来自异步社区<正则表达式经典实例(第2版)>一书中的第2章,第2.6节,作者: [美]Jan Goyvaerts , Steven Levithan著,更多章节内容可以访问云栖社区 ...

  4. php正则表达式经典实例,php半小时精通正则表达式

    php半小时精通正则表达式 更新时间:2006年11月26日 00:00:00   作者: 想必很多人都对正则表达式都头疼.今天,我以我的认识,加上网上一些文章,希望用常人都可以理解的表达方式.来和大 ...

  5. php正则表达式经典实例,php正则表达式学习示例

    收集了10个php正则表达式实例,希望对大家学习正则有所帮助. 1. 根据购物车中的商品Item ID,准确判断客人的原装机型号. 复制代码 代码如下: $title = "Replacem ...

  6. c语言单片机程序设计例,51单片机C语言程序设计经典实例(第2版)

    项目一 单片机系统的软.硬件开发环境 任务1 单片机最小应用系统的组成 任务2 Keil C51编译软件的使用 任务3 Proteus 80仿真软件的使用 项目二 C51程序设计语言基础 任务1 C ...

  7. Java经典实例:进阶版堆栈实现,支持任何对象类型

    支持任何对象类型,有更多的错误检查. package Stack;/*** Created by Frank*/ public class MyStack<T> implements Si ...

  8. 数据可视化(5)--jqplot经典实例

    本来想把实例也写到上篇博客里,最后发现太长了,拆成两篇博客了. 实例来源于官方文档:http://www.jqplot.com/tests/ 这篇博客主要是翻译了官方文档关于经典实例的解说,并在相应代 ...

  9. 《Adobe Illustrator CS6中文版经典教程(彩色版)》—第0课0.18节使用透视

    本节书摘来自异步社区<Adobe Illustrator CS6中文版经典教程(彩色版)>一书中的第0课0.18节使用透视,作者[美]Adobe公司,更多章节内容可以访问云栖社区" ...

最新文章

  1. svn 合并分支 等
  2. 【Android 逆向】类加载器 ClassLoader ( 使用 DexClassLoader 动态加载字节码文件 | 准备 DEX 字节码文件 )
  3. 数据中心机房布线系统运维和管理
  4. Python 字符串换行的几种方式
  5. 地图处理(dfs算法)
  6. 【Matlab】怎么判断两个字符串相等?
  7. 【Java报错】GP数据库 function point(unknown) is not unique.Could not choose a best candidate function 问题解决
  8. WebSockets 简介
  9. 转:Excel导入SQL数据库完整代码
  10. Python lambda表达式
  11. android finish 区别,Android Activity类finish、onDestory和System.exit介绍
  12. java 关注公众号没有调接口_高频面试题:接口和抽象类的区别
  13. 编译内核出错:invalid option `abi=aapcs-linux'
  14. 完美解决 vcpkg 下载速度慢
  15. 服务器2008修改端口,Windows Server 2008 R2需要修改445端口
  16. vep格式用什么播放器linux,vep格式视频用什么播放器打开
  17. python实现信号预加重
  18. Xenserver命令大全
  19. Sublime——让SublimeText换行的时候不拆散一个单词或者代码
  20. 开启Win7快速启动栏

热门文章

  1. Wayland 1.0 发布,图形服务器
  2. 转:Oracle中的rownum不能使用大于的问题
  3. TCP/IP模型及OSI七层参考模型各层的功能和主要协议
  4. /etc/sudoers文件的分析以及sudo的高级用法
  5. 单列(写了池子pool)用list实现的方法, 与伪单例(写了池子zidianpool),用字典实现的方法,可以存入不同,i名字的物体...
  6. 软件设计原则和方法通俗理解
  7. 军哥lnmp一键安装包详解
  8. windows上安装Metasploit Framework 4.0
  9. error C2065: “LOAD_LIBRARY_SEARCH_SYSTEM32”: 未声明的标识符
  10. leetcode笔记(Python版)待更新