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

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

本节书摘来自异步社区《正则表达式经典实例(第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)›之前不存在任何空格。因为只有在这个模式修饰符之后才会开始宽松排列模式,因此在它之前的任意空格都是不能忽略的。

相关文章
|
1月前
|
Java 程序员
Java 异常处理与正则表达式详解,实例演练及最佳实践
在 Java 代码执行期间,可能会发生各种错误,包括程序员编码错误、用户输入错误以及其他不可预料的状况。 当错误发生时,Java 通常会停止并生成错误消息,这个过程称为抛出异常。 try...catch 语句 try 语句允许您定义一段代码块,并在其中测试是否发生错误。 catch 语句允许您定义一段代码块,当 try 块中发生错误时执行该代码块。 try 和 catch 关键字成对使用,语法如下:
42 0
|
4月前
|
机器学习/深度学习 存储 JavaScript
正则表达式基础语法与Java、JS使用实例
正则表达式基础语法与Java、JS使用实例
72 1
|
7月前
|
Java
Java正则表达式校验实例
Java正则表达式校验实例
50 0
|
2月前
|
开发者 Python
Python中的正则表达式:re模块详解与实例
Python中的正则表达式:re模块详解与实例
|
8月前
|
Shell
shell中正则表达式中字符的应用具体实例以及详解
shell中正则表达式中字符的应用具体实例以及详解
94 3
|
10月前
|
Python
34.从入门到精通:Python3 正则表达式检索和替换 repl 参数是一个函数 正则表达式对象 正则表达式修饰符 - 可选标志 正则表达式模式* 正则表达式实例
34.从入门到精通:Python3 正则表达式检索和替换 repl 参数是一个函数 正则表达式对象 正则表达式修饰符 - 可选标志 正则表达式模式* 正则表达式实例
|
11月前
|
Python
Python正则表达式匹配电话号码和邮箱实例演示,正则表达式的基本用法
Python正则表达式匹配电话号码和邮箱实例演示,正则表达式的基本用法
204 0
|
JavaScript 前端开发
JavaScript使用正则表达式进行邮箱表单验证实例
JavaScript使用正则表达式进行邮箱表单验证实例
64 0
|
C语言
【正则表达式】快速学习一个c语言的实例
【正则表达式】快速学习一个c语言的实例
105 0
|
Web App开发 机器学习/深度学习 Windows
Python正则表达式一文详解+实例代码展示(下)
Python正则表达式一文详解+实例代码展示(下)
145 0