正则表达式入门笔记

概念:正则表达式是一些用来匹配和处理文本的字符串。它主要有两大功能,查找和替换。
 
在使用正则表达式的时候,所有的问题都有不止一种解决方案。
 
在正则表达式里,"." 可以匹配除换行符以外的任意字符,如果是要匹配“.”字符本身,需要使用"\"对其进行转义。
 
元字符[  ]用来定义一个字符区间,其含义是必须匹配该集合里的字符之一,定义一个字符集合有两种方法:一是把所有的字符都列举出来;二是利用元字符 以字符区间的方式给出如:[0-9a-z] , 字符集合可以用元字符 来求非,这将把字符集合强行排除在匹配操作之外,除了该字符集合里的字符,其他字符都可以匹配。
 
正则表达式里的元字符可以分为两种:一种是用来匹配文本的,另一种是正则表达式的语法所要求的如[  ]
如:空白元字符
匹配特定类别的字符:
1. 匹配数字的元字符:
 
2. 匹配字母和数字的元字符
 
3. 匹配空白字符类的元字符(注:退格字符[\b]不在类元字符\s覆盖范围内)
 
4. 匹配字符的十六进制编码用\x0a,  八进制编码用\011.
 
5. 实现重复匹配元字符
+号匹配一个和多个字符,最少一个。
号匹配零个和和多个字符,可以是零个。
号匹配字符集字符的零次或一次出现
为重复匹配设置一个精确的次数使用如: { 4 }, 字符出现4次,a{4},a字符重复出现4次
为重复次数指定一个区间,{2 , 4}, 最少2次,最多4次
匹配至少重复多少次,使用{3,},意思是至少匹配3次
注:在使用这些重复匹配的元字符时要防止,+,*这两种贪婪性元字符的过度匹配的情况,这时就要在这些元字符后加上?,使其变为懒惰型的元字符。
 
6. 位置匹配
 \b 可以用来匹配单词的边界,如\bcat\b,用来界定单词cat的边界。
\B  匹配前后都不是单词边界的元字符。
用来定义字符串边界的元字符有两个^ 和 $ , ^定义字符串开头,$定义字符串结束
7. 子表达式
在正则表达式中使用子表达式表示一个独立的匹配元素,子表达式用()包起来,在匹配中 | 表示表达式匹配的或操作。作用是把一组相关字符编组为一个字符集合,另一个用途是定义回溯引用。
子表达式的嵌套如:匹配一个有效的IP地址:
(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))
回溯引用指的是模式的后半部分引用在前半部分中定义的子表达式。
 
8.替换操作
在正则表达式的替换操作中,可以通过回溯引用子表达式的值,实现替换操作,引用子表达式的值,使用$1
例如将:  313-555-1234
                248-555-9999
                810-555-9000   替换成(313)-555-1234
搜索表达式:(\d{3})-(\d{3})-(\d{3})(\d)
替换表达式: ($1)-$2-$3
 
有些正则表达式实现,容易进行大小写的替换操作:
例如:
<h1>my name is mickey</h1>将该串标题中的文本替换成大写形式:
搜索表达式:(<[Hh][1-6]>)(.*?)(</[Hh][1-6]>)
替换表达式: $1\U$2\E$3
 
8. 前后查找
前面都是使用正则表达式匹配要找的文本,并返回匹配的结果,但有时候,我们只需要用表达式标记要匹配的文本位置,而不需要返回匹配的结果,这个时候就可以使用前后查找。
 向前查找:(用来标记位置的正则子表达式以?=开头)
    如:要找出下面一段文本的协议:
        http://www.forta.com/
        https://mail.forta.com/
        ftp://ftp.forta.com/
表达式:.+(?=:)
 
向后查找:查找出现在被匹配文本之前的字符。向后查找使用?<=
例如:要找出这段文本中的价格:ABC01: $23.45
                                                    HGG42: $5.31
表达式:(?<=\$)([0-9].)+
 
向前查找和向后查找通常是用来匹配文本,其目的是为了确定将被返回为匹配结果的文本的位置。通常用于指定匹配结果的前后必须是哪些文本。
前后查找分为正向前后查找和负向前后查找:
各种前后查找操作符如下:
例如:文本:I paid $30 for 100 apples
50 oranges, and 60 pears.
I saved $5 on this order.
查找数量使用负向后查找:
\b(?<!\$)\d+\b
 
只查找价格,使用正向后查找
\b(?<=\$)\d+\b
 
9. 在正则表达式中嵌入条件
?(回溯引用)true-regex|false-regex
例如:匹配正确格式的电话号码:123-456-7890或(123)456-7890
正则表达式:(\()?\d{3}(?(1)\(|-)\d{3}-\d{4}
文本:123-456-789
            (123)-456-789
            (123456-789
posted @ 2013-09-10 14:35  嘻哈披头士  阅读(107)  评论(0)    收藏  举报