博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
正则表达式之字符组
阅读量:6234 次
发布时间:2019-06-22

本文共 1819 字,大约阅读时间需要 6 分钟。

正则表达式之字符组

普通字符组

字符组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  用正则表达式判断数字字符在各种语言中的应用

.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://xszia.baihongyu.com/

你可能感兴趣的文章
asp.net MVC中怎样让LINQ Designer自动生成的类从别的类继承并调用其基类构造器?...
查看>>
用VMWARE模拟打造通用批量分发安装系统
查看>>
Python 字符串、列表、元组、索引、切片
查看>>
JAVA实现显示指定类型的文件的例子
查看>>
rm -rfi 防止误删除数据
查看>>
Java项目打war包的方法
查看>>
ubuntu server 10.4 下LVS-DR+heartbeat +Ldirectord实现web服务高可性负载均衡实验
查看>>
流媒体服务器支持flv格式文件
查看>>
(4)制作windows 2003自动安装盘-集成补丁/Raid及硬件驱动
查看>>
MDeamon如何限制进出邮件大小
查看>>
为C# as 类型转换及Assembly.LoadFrom埋坑!
查看>>
word的问题
查看>>
MDaemon邮件报表统计插件——MailDetective
查看>>
为何有着良好设计的系统代码反而不容易看懂?
查看>>
[Ajax]ajax入门
查看>>
什么是BPOS
查看>>
JSP中的四种属性范围(重点)
查看>>
Ubuntu init启动流程分析浅析
查看>>
linux之df命令
查看>>
HDOJ 1303 Doubles(简单题)
查看>>