正则表达式

当我们在进行查找和替换的时候,经常面对的一个问题就是如何匹配一个相对复杂的字符串。比方说我想从一个很长的文本中找到所有的有效的网址或者邮箱、电话等信息,此时如果通过肉眼或者是直接查找数字这样的方式,会是一件极其繁琐的事。
而正则表达式就是为了便利我们查找匹配、描述某种语法规则的一种特殊字符串模式。

正则表达式初给人的感觉就是比较难学,无从学习。之前在unix用find、awk、sed时小有接触,最近借了一本《正则表达式基本实例》,通过上面的学习来更深入地了解一些规则。可以说想要完全了解其中浩如烟海的规则是非常难的,但多积累一些经验却大有必要。

正则表达式英文为”Regular expression”, 下文中出现的”regex”、”regexp”都是正则表达式的意思。

正则表达式有很多流派,这本书里主要每次举例时都列举了.Net, Java, Javascript, PHP, Perl, Python, Ruby, C#的例子。我在下文主要用java/python的例子来说明。

先列一张常见元字符的表:
《正则表达式》

简单介绍几个

1. [] 字符组: 单个匹配

最常见的功能是匹配包含字符组里的一个字符
[abc]表示可以匹配a 或 b 或 c
[0-9]表示可以匹配数字
很多元字符在字符组内都变成了普通字符,如(\^$?)等。
(比如说\^在一般的匹配中代表开头的是什么,但是[^ 代表的就是除去中括号后面的都可以

var reg = /[^0-9]/
reg.test('1') // -> false
reg.test('2') // -> false
reg.test('a') // -> true

2. 几种反义

\d: 数字字符组(digit)
\w: 单词字符组(word)
\s: 空白字符组(space)
\D: 非数字字符组
\A: 匹配字符串开头

匹配字符串的开头。它和’\^’的区别是,’/A’只匹配整个字符串的开头,即使在’M’模式下,它也不会匹配其它行的很首。

\Z: 匹配字符串结尾

匹配字符串的结尾。它和’$’的区别是,’/Z’只匹配整个字符串的结尾,即使在’M’模式下,它也不会匹配其它各行的行尾。

例:

>>> s= ’12 34/n56 78/n90′

>>> re.findall( r’^/d+’ , s , re.M ) #匹配位于行首的数字

[’12’, ’56’, ’90’]

>>> re.findall( r’/A/d+’, s , re.M ) #匹配位于字符串开头的数字

[’12’]

>>> re.findall( r’/d+$’ , s , re.M ) #匹配位于行尾的数字

[’34’, ’78’, ’90’]

>>> re.findall( r’/d+/Z’ , s , re.M ) #匹配位于字符串尾的数字

[’90’]

3. () 多个匹配

也就是说括号内的算一组
例如(com|cn|net) 就可以限制为com或cn或net

4. {} 匹配次数

[a-c]{2} 匹配a-c之间的一个字符2次
{com}匹配com一次
\W{1,3}非字母数字出现次数为1-3次

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注