正则表达式基础知识
本文内容主要选自《正则表达式必知必会》,薄薄的书(100页左右),信息量却很大,非常适合正则表达式入门.
正则表达式测试小软件下载地址:http://www.forta.com/books/0672325667
一、概述
1.正则表达式是用来描述文本的模式结构的表达式,是由正则表达式语言写成的由特殊字符、普通字符组合而成的具有特定含义的字符串。
比如单个数字的正则表达式是[0-9]或\d;三位数字的正则表达式是[0-9][0-9][0-9]或\d{3}。由上可见,
2.一个文本模式可能有多种正则表达式写法,有的简单,有的快速,有的功能全面,有的兼容性好,要多多尝试。
3.正则表达式是"文本内匹配",比如,文本shuqin1984,正则表达式\d{4}将在整个文本中匹配1984部分。
4.正则表达式的一个难点是:要匹配期望的文本比较容易,但要将不期望的东西排除掉比较困难。比如三位数,若写成
\d{3},则虽然所有三位数都囊括进去,但不合法的格式文本比如001,023也包含进去了。正确的写法是:[1-9]\d{2}
因此,使用正则表达式之前,对要匹配的文本的模式结构和规则要有清晰明确的归纳,以防漏掉要匹配的文本,
却将不期望的文本匹配进去。
5.掌握正则表达式语法相对容易,更重要的是灵活应用,多多实践。
二、匹配单个字符
1.匹配任意单个字符:.比如sa.可以匹配sa后跟任意字符的字符串
2.匹配指定字符集合中的任意单个字符:比如[abc]将匹配a或b或c,ca[ptb]将匹配cap,cat或cab.
3.匹配指定字符集合之外的任意单个字符:比如[^abc]将匹配除了a,b,c之外的任意单个字符。
ca[^ptb],将匹配caX的任意文本,除了cap,cat,cab
实验:
sales.xlsorder3.xlssales2.xlssales3.xlsapac1.xlseurope2.xlssam.xls
saM.XLSna1.xlsna2.xlssa1.xlsca1.xls
正则表达式:sa.sa[lm]sa[^lm][ns]a[1-2][ns]a[^1-2]
4.匹配特殊字符:需要用\进行转义,比如匹配.的正则式是\.,匹配\的正则式是\\,匹配(的正则式是\(
凡是在正则式中具有特殊含义的字符,要匹配字符本身(将其作为普通文本)都必须进行转义.
通常需要转义的字符有:.+*?{}[]()-\^$
文本同上。正则表达式sa.\.xlssa[mlM]\.xlssa[^mlM]\.xls
5.匹配空白字符:\f换页\n换行\r回车\t制表符\v垂直制表符空格符
实验文本:
(x+y)^n=C(n,0)x^n+C(n,1)x^(n-1)*y+...+C(n,k)x^(n-k)*y^k+...+C(n,n-1)x*y^(n-1)+C(n,n)y^n
正则表达式:C(.,.)C\(.,.\)\+\s+\+\s+x\^\(n(-[0-9a-z])?\)
6.匹配字符区间集合的任意单个字符:
[0-9]任意数字[a-z]任意小写字母[A-Z]任意大写字母[a-f]a,b,c,d,e,f
[a-zA-Z]任意大小写字母[^0-9]任意非数字的字符[^a-zA-Z]任意非大小写字母的字符
7.匹配特殊字符集合中的任意单个字符:等价于
\d[0-9]任意单个数字\D[^0-9]任意单个的非数字字符
\w[a-zA-Z0-9_]\W[^a-zA-Z0-9_]
\s[\f\n\r\t\v]\S[^\f\n\r\t\v]
实验:
正则表达式:[0-9a-fA-F]{6}|[0-9a-fA-F]{3}匹配336633和FFF
8.POSIX字符类:例如:
[:digit:][0-9];[:alpha:][a-zA-Z];[:alnum:][a-zA-Z0-9]
具体应用要再加一层括号,比如TEST[[:digit:]]匹配TEST0-TEST9
三、匹配字符组合
1.XY:匹配X后跟Y的文本,比如[0-9][a-z]匹配数字后跟小写字母的文本,7z,0x等,但不匹配ap,77
2.X|Y:匹配X或者Y,比如[0-9]|[a-z]匹配数字或小写字母,相当于[0-9a-z]
3.匹配一个或多个X:X+;例如s\d+匹配s后跟至少一个数字,s9,s34,s235,...
匹配零个或多个X:X*;例如s\d*匹配s后跟空或者至少一个数字,s,s9,s34,s235,...
匹配零个或一个X:X?;例如https?匹配http或https
匹配恰好m个X:X{m};例如s\d{4}匹配s0000,s1234,但不匹配s234,s23445
匹配至少m个X:X{m,};例如s\d{2,}匹配s12,s123,但不匹配s1
匹配至少m个但不超过n个X:X{m,n};例如s\d{2,4},匹配s12,s123,s1234,但不匹配s1,s12345
4.以上X可以是一个子表达式:例如(s\d){3}匹配s1s1s1,而不匹配s111
实验:
s,s1,s12,s123,s1234,s12345,s123456,...s111,s1s1s1,s2s2,s22,s3333,s3s3s3s3,...
正则表达式:s\d*,s\d+,s\d?s\d{3},s\d{2,}s\d{2,4},
(s\d)*,(s\d)+,(s\d)?,(s\d){3},(s\d){2,},(s\d){2,4},
5.惰性匹配:默认匹配模式是"贪婪型匹配",即匹配尽可能多的文本
实验:Youmakemelost.
正则式:.*.*?(?).*?(?=)
6.匹配位置:
[1]\b单词边界\B非单词边界。
文本:Thecaptainworehiscapandcapeproudlyashesatlistening
totherecapofhowhiscrewsavedthemenfromacapsizedvessel.
正则式:cap\bcapcap\b\bcap\b\Bcapcap\B\Bcap\B
[2]^匹配文本起始$匹配文本末尾
例如^[a-z]123将匹配文本a123而不是slha123即以小写字母开头后跟123的文本
[a-z]123$将匹配文本sssd123而不是sdf123dss即以小写字母后跟123结尾的文本
实验:a123a123sssa123
正则式:^a123a123$
7.子表达式:使用括号将一个正则表达式作为整体
例如:三位数.三位数.三位数.三位数:(\d{1,3}\.){1,3}\d{1,3};(\d{1,3}\.)就是一个子表达式
例如:IP地址:0-255.0-255.0-255.0-255,这里关键是表达0-255中的任意数字
将0-255划分为几个区段:0-9,10-99,100-199,200-249,250-255
(\b([0-9]|([1-9][0-9])|(1\d{2})|(2[0-4][0-9])|(25[0-5]))\.){3}
([0-9]|([1-9][0-9])|(1\d{2})|(2[0-4][0-9])|(25[0-5]))
实验:122.204.142.1192.168.1.1127.0.0.1122.375.86.2
375.122.45.2122.204.256.1122.23.21.256
8.回溯引用:相同匹配的概念
例如:匹配.*?这里\1可以捕获([hH][1-6])所得到的结果,从而起到对应的效果,以免匹配到
23的不合法文本。即,若则\1表示h1,若则\1表示H2
文本:HELLOWORLDWAOYEAH
正则式:.*?.*?
引用:((regex1)-(regex2))-(regex3)\nn按左括号出现的顺序进行标识
\0表示匹配的整个文本\1((regex1)-(regex2))\2(regex1)\3(regex2)\4(regex3)
在替换文本时可以使用$1,$2,$3,$4分别引用\1,\2,\3,\4捕获的文本。
例如:正则表达式((abc)-(def))-(ghf)匹配文本abc-def-ghf
$1--->abc-def;$2--->abc;$3--->def;$4--->ghf
9.前后查找:位置匹配的概念
比如:要查找scatterlocaterocate中cat后面是e的单词,使用cat(?=e),注意,这里并不会捕获e,而是用e作为捕获cat的定位信息;要查找cat前面是s的单词,使用(?正则式:((https?)|(ftp))(?=:)
10.嵌入条件:条件匹配的概念
比如,要匹配(123)456-7890或123-456-7890,而不匹配(123)-456-7890,123456-7890,(123-456-7890等,
这意味着,若123前面是(则后面要匹配)且不跟-;若123前面不是(,则后面匹配-
正则表达式是:(\()?\d{3}(?(1)\)|-)\d{3}-\d{4}
(\()?表示是否存在(,这里用括号将(作为子表达式,以便于后面回溯引用;
(?(1)\)|-)表示,如果存在(,则匹配),否则匹配-
?(back-ref)true-regex表示,只有当back-ref存在时,才会匹配true-regex;
?(back-ref)true-regex|false-regex表示,若back-ref存在,匹配true-regex;若不存在,匹配false-regex.
文本:(123)456-7890123-456-7890(123)-456-7890123456-7890(123-456-7890
正则式:\(?\d{3}\)?-?\d{3}-\d{4}(\()?\d{3}(?(1)\)|-)\d{3}-\d{4}
四、小结
以上所述就是构造正则表达式的基本知识。编写正则表达式的一个技巧是分而治之,先划分成若干子表达式分别调试成功,再组合起来。要掌握这样一个强大的文本工具,惟有勤加练习,勤于思考求精耳。