归类 : 默认分类
文集 : 浅谈

十分钟复习下正则

在线测试工具:

http://tool.oschina.net/regex

常用的元字符

语法
说明
.
匹配除换行符以外的任意字符
w
匹配字母或数字或下划线或汉字
s
匹配任意的空白符
d
匹配数字
b
匹配单词的开始或结束
^
匹配字符串的开始
$
匹配字符串的结束

重复

语法
说明
*
重复零次或更多次
+
重复一次或更多次
?
重复零次或一次
{n}
重复n次
{n,}
重复n次或更多次
{n,m}
重复n到m次

分枝

使用|标识分歧,可类比编程语言中的‘或’

固定电话号码正则:

    0\d{2}-\d{8}|0\d{3}-\d{7}

匹配两种以连字号分隔的电话号码:

  1. 3位区号,8位本地号(如001-12345678);
  2. 4位区号,7位本地号(0123-1234567)。

分组

使用'( )'标识分组:

IP地址正则:

    (\d{1,3}\.){3}\d{1,3}
  1. d{1,3}匹配1到3位的数字;
  2. (d{1,3}.){3}匹配三位数字加上一个英文句号(分组)重复3次;
  3. 最后再加上一个一到三位的数字(d{1,3})

反义

使用'^'标识取反:

匹配用尖括号括起来的以a开头的字符串

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

零宽断言

零宽度正预测先行断言

断言自身出现的位置的后面能匹配表达式exp

    (?=exp)

匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc

    \b\w+(?=ing\b)

零宽度正回顾后发断言

断言自身出现的位置的前面能匹配表达式exp

    (?<=exp)

匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading

    (?<=\bre)\w+\b

负向零宽断言

零宽度负预测先行断言

断言此位置的后面不能匹配表达式exp

    (?!exp)

匹配三位数字,而且这三位数字的后面不能是数字,例如abc123456def,它匹配456

    \d{3}(?!\d)

零宽度负回顾后发断言

断言此位置的前面不能匹配表达式exp

    (?<!exp)

前面不是小写字母的3位数字,例如A123b123,它匹配123

    (?<![a-z])\d{3}

贪婪与懒惰

默认为贪婪模式,即正则会匹配最长的结果,如

    1.*1

匹配最长的以1开始,以1结束的字符串,例如1231231001,它匹配1231231001

懒惰

    1.*?1

匹配最短的以1开始,以1结束的字符串,例如1231231001,它匹配到2个结果 ‘1231’和‘1001’

懒惰限定符

语法
说明
*?
重复任意次,但尽可能少重复

+?
重复1次或更多次,但尽可能少重复
??
重复0次或1次,但尽可能少重复
{n,m}?
重复n到m次,但尽可能少重复
{n,}?
重复n次以上,但尽可能少重复

以上