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

    xiaoxiao2024-01-23  19

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

    相关资源:正则表达式经典实例
    最新回复(0)