Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29955590
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: 系统运维

2010-01-31 22:52:51

正则表达式专题

一、正则表达式简介

使用工具:Match Tracer

二、正则表达式学习

元字符

.             匹配除换行符以外的任意字符

\w            匹配字母或数字或下划线或汉字

\s             匹配任意的空白符

\d             匹配数字

\b             匹配单词的开始或结束

^              匹配字符串的开始

$              匹配字符串的结束

PS:其中\w  \s  \b 使用的次数不是很频繁。可能会比较陌生。希望可以经常使用!

示例:

^\d{5,12}$                   匹配5位到12位数字

说明:{5,12}               表示次数不能少于5次不能多于12次。

 

字符转义

查找元字符本身的话,比如查找.*就可以用转义

示例:\.\*  要查找\本身,你也得用\\                转义字符

 

重复

*                   重复零次或更多次

+                 重复一次或更多次

?                        重复零次或一次    01次)

{n}                      重复n                    

{n,}              重复n次或更多次   n到更多次)

{n,m}           重复nm

 

 

分枝条件

正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开。(相当于编程语言中的or条件)

0\d{2}-\d{8}|0\d{3}-\d{7} 这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(010-12345678),一种是4位区号,7位本地号(0376-2233445)

PS:这样的话我们可以写一个正则表达式匹配多个符合条件的记录

使用分枝条件时,要注意各个条件的顺序

匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。

PS:一旦从左到右匹配到了一个分枝条件的话就会立刻中止后面的匹配操作!

 

 

 

分组(将多个字符当成一个处理单元)

       我们已经提到了怎么重复单个字符(直接在字符后面加上限定符就行了);但如果想要重复多个字符又该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了

PS:即将多个字符当成一个单元去处理。分组的时候就当成是一个大的单元项直接指定其重复的次数就行 () 分组表示

 

(\d{1,3}\.){3}\d{1,3}   \d{1,3}\. 当成是一个单元进行匹配处理!

((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)  匹配IP地址

 

反义

       需要查找不属于某个能简单定义的字符类的字符。

\W                 匹配任意不是字母,数字,下划线,汉字的字符

\S                  匹配任意不是空白符的字符

\D                  匹配任意非数字的字符

\B                  匹配不是单词开头或结束的位置

[^x]                匹配除了x以外的任意字符

[^aeiou]      匹配除了aeiou这几个字母以外的任意字符

 

 

后向引用

每个分组会自动拥有一个组号,

规则:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2

(组号是从1开始的。而不是从0开始的)

后向引用:用于重复搜索前面某个分组匹配的文本。例如,\1代表分组1匹配的文本

示例:

\b(\w+)\b\s+\1\b                         可以用来匹配重复的单词

PS:  \b 匹配单词的开始或结束  \s 匹配任意的空白符

含义:开头以\w 开始的 然后就直接结束 中间带上\s+ 即空白符。然后再\1 表示了前面第一个分组的匹配内容了!

即类似于abc abc 就可以匹配进来

PS:我的理解就是后向引用就是引用那些分组。为了避免书写重复的正则表达式可以将前面的分组单独拿出来写。

这是默认的情况,当然我们也可以指定组名的。即第一个分组的名称是什么第二个分组的名称又是什么!

(?\w+)  

\b(\w+)\b\s+\1\b  中我们想对(\w+) 这个组进行取一个组名的话就可以

这样写了 \b(?\w+)\b\s+\1\b   即可以对我们的分组进行取名称的!

这样的话我们就可以直接在后面引用此分组的名称了\k 引用

上面的也可以这样写:\b(?\w+)\b\s+\k\b

PS指定组名称然后再引用此组名称进来!

后向引用可以直接引用前面的分组内容。

 

 

常用的分组语法

捕获

(exp)                    匹配exp,并捕获文本到自动命名的组里

(?exp)    匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)

(?:exp)          匹配exp,不捕获匹配的文本,也不给此分组分配组号

 

 

零宽断言

(?=exp)                匹配exp前面的位置

(?<=exp)              匹配exp后面的位置

(?!exp)                 匹配后面跟的不是exp的位置

(?                      匹配前面不是exp的位置

 

注释

(?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

 

 

零宽断言

查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言

 

(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。比如\b\w+(?=ing\b),匹配ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配singdanc

 

(?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。比如(?<=\bre)\w+\b会匹配re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading

 

贪婪与懒惰

       当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。

PS贪婪的意思就是会尽可能多地去匹配)

 

       有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复

 

a.*?b 匹配最短的,以a开始,以b结束的字符串

 

 

 

懒惰限定符

*?                        重复任意次,但尽可能少重复

+?                        重复1次或更多次,但尽可能少重复

??                        重复0次或1次,但尽可能少重复

{n,m}?                 重复nm次,但尽可能少重复

{n,}?                    重复n次以上,但尽可能少重复

PS:在原有的基础上面添加? 表示做了懒惰限制处理!

 

 

 

以上整理了正则表达式的常用理论,现在来整理常用的正则表达式

1、  匹配email地址

\w+([-+.]\w+)*@\w+([-.]\w+)*.\w+([-.]\w+)*

 

2、  匹配网址URL的正则表达式

 

阅读(1100) | 评论(0) | 转发(0) |
0

上一篇:php正则表达式专题

下一篇:MySQL慢查询

给主人留下些什么吧!~~