《正则表达式经典实例(第2版)》——2.4 匹配任意字符

简介: 然而,对于任意字符到底意味着什么则存在一些混淆。用来处理正则表达式的最古老的工具在处理文件时是逐行处理的,因此,在目标文本中从来不可能出现包含换行符的情形。在本书中讨论的编程语言则会把目标文本当作一个整体来处理,而不去管其中到底会包含多少个换行符。

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

2.4 匹配任意字符

本实例讲解点号元字符的使用和原理。

问题描述
匹配一个被单引号包围的字符。第一种解决方案允许在引号之间出现除了换行符之外的任意单个字符。第二种解决方案允许出现任意字符,包括换行符在内。

解决方案
除了换行符之外的任意字符

'.'
正则选项:无(“点号匹配换行符”选项必须关闭)
正则流派:.NET、Java、JavaScript、PCRE、Perl、Python、Ruby

包含换行符在内的任意字符

'.'
正则选项:点号匹配换行符
正则流派:.NET、Java、PCRE、Perl、Python、Ruby
'[\s\S]'
正则选项:无
正则流派:.NET、Java、JavaScript、PCRE、Perl、Python、Ruby

讨论
除了换行符之外的任意字符
点号是最古老也是最简单的正则表达式特性之一。它的含义永远是匹配任意单个字符。

然而,对于任意字符到底意味着什么则存在一些混淆。用来处理正则表达式的最古老的工具在处理文件时是逐行处理的,因此,在目标文本中从来不可能出现包含换行符的情形。在本书中讨论的编程语言则会把目标文本当作一个整体来处理,而不去管其中到底会包含多少个换行符。如果想要使用真正的逐行处理,就必须编写一些代码来把目标文本分割成包含单个文本行的数组,然后把正则表达式应用到该数组中的每行之上。下一章中的实例3.21会讲解这样做的方法。

Perl语言的开发者Larry Wall希望Perl能够保留基于文本行的工具的传统行为,也就是点号不会匹配换行符(n)。本书中讨论的所有其他流派也都采取了相同的策略。因此,‹.›会匹配除了换行字符之外的任意单个字符。

包含换行符在内的任意字符
如果确实想允许你的正则表达式可以跨越多个文本行,就需要打开“点号匹配换行符”的选项。这个选项可能会存于不同的名称之下。Perl以及许多其他流派会把它称作“单行”(single line)模式,这听起来有些让人摸不着头脑;而在Java中则把它称为“dot all”模式。下一章中的实例3.4会介绍所有的细节。不管在你所喜爱的编程语言中这个选项所用的名称是什么,都可以把它当作是“点号匹配换行符”模式。因为这就是该选项的确切含义。

而对于JavaScript来说,就需要使用另外一种解决方案,因为在其中并不包含“点号匹配换行符”的选项。按照在实例2.3中的讲解,‹s›会匹配任意空白字符,‹S›而则会匹配‹s›不能匹配的任意字符。把这二者组合起来构成‹[sS]›,这样就会得到一个包含所有字符的字符组,其中也包含了换行符。类似的,‹[dD]›和‹[wW]›也会产生同样的效果。

点号的滥用
点号是最经常被滥用的正则表达式特性。例如,‹dd.dd.dd›并不是用来匹配日期的好方法。它的确会匹配到05/16/08,但是它同时也会匹配99/99/99。更为甚者,它还会匹配12345678。

如何使用一个正则表达式来只匹配合法的日期会在后面的章节中讲解(阅读实例4.5)。显然把点号替换成一个更合适的字符组是非常容易的。‹dd[/.-]dd[/.-]dd›允许使用斜杠、点号或者连字符来作为日期分隔符。这个正则表达式还是会匹配99/99/99,但是至少不会再匹配12345678。

screenshot虽然在前面的例子中,字符组之内包含了一个点号,但这只是一个巧合。事实上,在字符组之内,点号就是一个字面字符。在上面这个正则表达式中之所以会包含点号,是因为在一些国家(如德国),点号会被用来作为日期分隔符。
最好只有当你确实想要允许出现任意字符时,才使用点号。而在任何其他场合,都应当使用一个字符组或者是排除型字符组。

变体
下面是如何用内联模式修饰符匹配引号内包括换行符在内的任意字符:

(?s)'.'
正则选项:无
正则流派:.NET、Java、XRegExp、PCRE、Perl、Python
(?m)'.'
正则选项:无
正则流派:Ruby

如果在正则表达式之外无法启用“点号匹配换行符”模式,那么你可以在正则表达式的开始处放一个模式修饰符。在实例2.1中的“不区分大小写的匹配”小节中,我们已经介绍了模式修饰符的概念,并且也知道了JavaScript不支持此特性。

在 .NET、Java、XRegExp、PCRE、Perl和Python中,‹(?s)›是用于“点号匹配换行符”模式的模式修饰符。这里的s代表的是“single line”(单行)模式,也就是在Perl中给“点号匹配换行符”所起的令人很容易混淆的名字。

相关文章
|
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正则表达式校验实例
49 0
|
1月前
|
Java
38、Java 中的正则表达式(单字符匹配和预定义字符)
38、Java 中的正则表达式(单字符匹配和预定义字符)
18 0
|
2月前
|
开发者 Python
Python中的正则表达式:re模块详解与实例
Python中的正则表达式:re模块详解与实例
|
8月前
正则表达式中的字符详解
正则表达式中的字符详解
62 1
|
4月前
|
人工智能 JavaScript
js正则表达式new RegExp(表达式, “gi“)不区分大小写、忽略大小写匹配替换字符
js正则表达式new RegExp(表达式, “gi“)不区分大小写、忽略大小写匹配替换字符
|
5月前
|
Python
132 python高级 - 正则表达式(表示字符)
132 python高级 - 正则表达式(表示字符)
48 0
|
8月前
|
Shell
shell中正则表达式中字符的应用具体实例以及详解
shell中正则表达式中字符的应用具体实例以及详解
94 3
|
10月前
|
Python
34.从入门到精通:Python3 正则表达式检索和替换 repl 参数是一个函数 正则表达式对象 正则表达式修饰符 - 可选标志 正则表达式模式* 正则表达式实例
34.从入门到精通:Python3 正则表达式检索和替换 repl 参数是一个函数 正则表达式对象 正则表达式修饰符 - 可选标志 正则表达式模式* 正则表达式实例