正则表达式之字符组

正则表达式之字符组

普通字符组

字符组Character Class)是正则表达式最基本的结构之一,要理解正则表达式的“灵活”,认识它是第一步。

顾名思义,字符组就是一组字符,在正则表达式中,它表示“在同一个位置可能出现的各种字符”,其写法是在一对方括号[]之间列出所有可能出现的字符,简单的字符组比如[ab][314][#.?]在解决一些常见问题时,使用字符组可以大大简化操作,下面举“匹配数字字符”的例子来说明。

字符可以分为很多类,比如数字、字母、标点等。有时候要求 “只出现一个数字字符”,换句话说,这个位置上的字符只能是012、…、8910个字符之一。要进行这种判断,通常的思路是:用10个条件分别判断字符是否等于这10个字符,对10个结果取“或”,只要其中一个条件成立,就返回True,表示这是一个数字字符,其伪代码如例1-1所示。

 

1-1 判断数字字符的伪代码

charStr == "0" || charStr == "1" || charStr == "9"

 

注:因为正则表达式处理的都是“字符串”(String)而不是“字符”,所以这里假设变量charStr(虽然它只包含一个字符)也是字符串类型,使用了双引号,在有些语言中字符串也用单引号表示。

 

这种解法的问题在于太烦琐——如果要判断是否是一个小写英文字母,就要用||连接26个判断;如果还要兼容大写字母,则要连接52个判断,代码长到几乎无法阅读。相反,用字符组解决起来却异常简单,具体思路是:列出可能出现的所有字符(在这个例子里就是10个数字字符),只要出现了其中任何一个,就返回True。例1-2给出了使用字符组判断的例子,程序语言使用Python

 

1-2  用正则表达式判断数字字符

re.search("[0123456789]", charStr) != None

 

re.search()Python提供的正则表达式操作函数,表示“进行正则表达式匹配”;charStr仍然是需要判断的字符串,而[0123456789]则是以字符串形式给出的正则表达式,它是一个字符组,表示“这里可以是012、…、89中的任意一个字符。只要charStr与其中任何一个字符相同(或者说“charStr可以由[0123456789]匹配”),就会得到一个MatchObject对象(这个对象暂时不必关心,在第21页会详细讲解);否则,返回None。所以判断结果是否为None,就可以判断charStr是否是数字字符。

当今流行的编程语言大多支持正则表达式,上面的例子在各种语言中的写法大抵相同,唯一的区别在于如何调用正则表达式的功能,所以用法其实大同小异。例1-3列出了常见语言中的表示,如果你现在就希望知道语言的细节,可以参考本书第三部分的具体章节。

 

1-3  用正则表达式判断数字字符在各种语言中的应用[1]

.NETC#

//能匹配则返回true,否则返回false

Regex.IsMatch(charStr, "[0123456789]");

Java

//能匹配则返回true,否则返回false

charStr.matches("[0123456789]");

JavaScript

//能匹配则返回true,否则返回false

/[0123456789]/.test(charStr);

PHP

//能匹配则返回1,否则返回0

preg_match("/[0123456789]/", charStr);

Python

#能匹配则返回RegexObject,否则返回None

re.search("[0123456789]", charStr)

Ruby

#能匹配则返回0,否则返回nil

charStr =~ /[0123456789]/

 

可以看到,不同语言使用正则表达式的方法也不相同。如果仔细观察会发现Java.NETPythonPHP中的正则表达式,都要以字符串形式给出,两端都有双引号";而RubyJavaScript中的正则表达式则不必如此,只在首尾有两个斜线字符/,这也是不同语言中使用正则表达式的不同之处。不过,这个问题现在不需要太关心,因为本书中大部分例子以Python程序来讲解,下面讲解关于Python的基础知识,其他语言的细节留到后文会详细介绍。

 

 

本文节选自《正则指引》一书 余晟著

图书详细信息:

http://www.cnblogs.com/broadview/archive/2012/05/15/2501879.html



 

原文地址:https://www.cnblogs.com/broadview/p/2501899.html