Chinaunix首页 | 论坛 | 博客
  • 博客访问: 965473
  • 博文数量: 120
  • 博客积分: 6454
  • 博客等级: 准将
  • 技术积分: 1739
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-28 17:45
文章分类

全部博文(120)

文章存档

2014年(1)

2013年(1)

2012年(11)

2011年(16)

2010年(6)

2009年(11)

2008年(30)

2007年(44)

分类:

2007-12-21 16:59:08

     1. 正则表达式是什么

     在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。简单说:正则表达式是用于进行文本匹配的工具。

     2. 元字符(metacharacter)

     \b 是代表着单词的开头或结尾,也就是单词的分界处。\b 匹配这样的位置:它的前一个字符和后一个字符不全是(一个是,一个不是或不存在)\w
     .  匹配除了换行符以外的任意字符
     \d 匹配任意的数字(0~9)
     \s 匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等
     \w 匹配字母或数字或下划线或汉字等
     ^  匹配要用来查找的字符串的开头,除非 ^ 在方括号表达式中使用,此时它表示不接受该字符集合
     $  匹配输入字符串的结尾位置

     3. 如果你想查找元字符本身的话,就要使用转义字符\

     4. 限定符

     * 它代表的不是字符,也不是位置,而是数量——它指定*前边的内容可以连续重复出现任意次以使整个表达式得到匹配,可能是0次
     + 匹配重复1次或更多次
     ? 重复零次或一次
     {n} 重复n次
     {n,} 重复n次或更多次
     {n,m} 重复n到m次

     5. 匹配没有预定义元字符的字符集合

     只需要在中括号里列出它们就行了:
     [aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!)(英文语句通常只以这三个标点结束)
     也可以轻松地指定一个字符范围,像[0-9]代表的含意与\d就是完全一致的:一位数字,同理[a-z0-9A-Z_]也完全等同于\w(如果只考虑英文的话)

     6. 反义代码

     \W 匹配任意不是字母,数字,下划线,汉字的字符
     \S 匹配任意不是空白符的字符
     \D 匹配任意非数字的字符
     \B 匹配不是单词开头或结束的位置
     [^x] 匹配除了x以外的任意字符
     [^aeiou] 匹配除了aeiou这几个字母以外的任意字符

     7. 正则表达式里的替换指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用 | 把不同的规则分隔开

     使用替换时,顺序是很重要的。原因是匹配替换时,将会从左到右地测试每个分枝条件,如果满足了某个分枝的话,就不会去管其它的替换条件了

     8. 子表达式

     用()括起来就是一个字表达式,用法上与单个字符没有区别

     9. 后向引用

     使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推;
     后向引用用于重复搜索前面某个分组匹配的文本。例如,\1代表分组1匹配的文本;
     也可以自己指定子表达式的组名。要指定一个子表达式的组名,请使用这样的语法:(?\w+)(或者把尖括号换成'也行:(?'Word'\w+)),这样就把\w+的组名指定为Word了。要反向引用这个分组捕获的内容,你可以使用\k

     10. ()的其他用处

     捕获:
     (exp) 匹配exp,并捕获文本到自动命名的组里
     (?exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
     (?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号

     11. 零宽断言 与 负向零宽断言

     用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(断言),因此它们也被称为零宽断言
     (?=exp) 匹配exp前面的位置 。也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp
     (?<=exp) 匹配exp后面的位置 。也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp
     (?!exp) 匹配后面跟的不是exp的位置 。零宽度负预测先行断言。断言此位置的后面不能匹配表达式exp
     (?

     12. 注释

     (?#comment) 这种类型的组不对正则表达式的处理产生任何影响,用于提供注释让人阅读。要包含注释的话,最好是启用“忽略模式里的空白符”选项,这样在编写表达式时能任意的添加空格,Tab,换行,而实际使用时这些都将被忽略。启用这个选项后,在#后面到这一行结束的所有文本都将被当成注释忽略掉。

     13. 懒惰限定符

     匹配尽可能少的字符。只要在它后面加上一个问号?
     这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。
     正则表达式有另一条规则,比懒惰/贪婪规则的优先级更高:最先开始的匹配最有最大的优先权——The Match That Begins Earliest Wins。
     *? 重复任意次,但尽可能少重复 
     +? 重复1次或更多次,但尽可能少重复 
     ?? 重复0次或1次,但尽可能少重复 
     {n,m}? 重复n到m次,但尽可能少重复 
     {n,}? 重复n次以上,但尽可能少重复

14. 非打印字符

     \cx  匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符
     \f  匹配一个换页符。等价于 \x0c 和 \cL
     \n  匹配一个换行符。等价于 \x0a 和 \cJ
     \r  匹配一个回车符。等价于 \x0d 和 \cM
     \s  匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v] 
     \S  匹配任何非空白字符。等价于 [^ \f\n\r\t\v]
     \t  匹配一个制表符。等价于 \x09 和 \cI
     \v  匹配一个垂直制表符。等价于 \x0b 和 \cK

15. 各种操作符的运算优先级

相同优先级的从左到右进行运算,不同优先级的运算先高后低。各种操作符的优先级从高到低如下:

 操作符

 描述

 \  转义符
 (), (?:), (?=), []  圆括号和方括号
 *, +, ?, {n}, {n,}, {n,m}  限定符
 ^, $, \anymetacharacter  位置和顺序
 |  “或”操作



阅读(1859) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~