正则表达式由元字符及其不同组合来构成,通过巧妙地构造正则表达式可以匹配任意字符串,并完成复杂的字符串处理任务。常用的正则表达式元字符如下表所示:
元字符 | 功能说明 |
. | 匹单个字符配除换行符以外的任意 |
* | 匹配*之前的字符或子模式的0次或多次出现 |
+ | 匹配位于+之前的字符或子模式的1次或多次出现 |
- | 用在[]之内,表示范围 |
| | 匹配位于|之前或之后的范围 |
^ | 匹配行首,匹配以^后面的字符串开头的字符串 |
$ | 匹配行尾,匹配以$之前的字符串结束的字符串 |
? |
匹配位于?之前的0个或1个字符。当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是“非贪心的”。 “非贪心的”模式匹配搜索到的、尽可能短的字符串,而默认的“贪心的”模式匹配搜索到的,尽可能长的字符串。 例如,在字符串“oooo”,"o+?",而“o+”匹配所有o |
\ | 表示位于\之后的转义字符 |
\num | 此处的num是一个正整数。例如,“(.)\1”匹配两个连续的相同字符 |
\f | 换页符匹配 |
\n | 换行符匹配 |
\r | 匹配一个回车符 |
\b | 匹配单词头或单词尾 |
\B | 与\b含义相反 |
\d | 匹配任何数字,相当于[0-9] |
\D | 与\d含义相反,等效于[^0-9] |
\s | 匹配任何空白字符,包括空格、制表符、换页符,与[\f\n\r\t\v]等效 |
\S | 与\s含义相反 |
\w | 匹配任何字母、数字以及下划线,相当于[a-zA-Z0-9_] |
\W | 与\w含义相反,与[^A-Za-z0-9_]等效 |
() | 将位于()内的内容作为一个整体来对待 |
{} | 按{}中的次数进行匹配 |
[] | 匹配位于[]中的任意一个字符 |
[^xyz] | ^放在[]内表示反向字符集,匹配除x、y、z之外的任意字符 |
[a-z] | 字符范围,匹配指定范围内的任何字符 |
[^a-z] | 反向范围字符,匹配除小写英文字母之外的任何字符 |
如果以“\”开头的元字符与转义字符相同,则需要使用“\\”,或者使用原始字符串。在字符串前加上字符r或R之后表示原始字符串,字符串中任意字符都不再进行转义。原始字符串可以减少用户的输入,主要用于正则表达式和文件路径字符串的情况,单如果字符串以一个"\"结束,则需要多些一个斜线,即以“\\”结束。
具体应用时,可以单独使用某种类型的元字符,但处理复杂字符串时,经常需要将多个正则表达式元字符进行组合,下面给出几个简单实例。
(1) 最简单的正则表达式是普通字符串,只能匹配自身。
(2)‘[pjc]ython‘可以匹配‘python‘、‘jython‘、‘cython‘。
(3)‘[a-zA-Z0-9]‘可以匹配任意一个大小写字母或数字。
(4)‘[^abc]‘可以一个匹配任意一个除‘a‘、‘b‘、‘c‘之外的字符。
(5)‘python|perl‘或‘p(ython|erl)‘都可以匹配‘python‘或‘perl‘。
(6)子模式后面加上问号表示可选。r‘(http://)? (www\.)? python\.org‘只能匹配‘http://www.python.org‘、‘http://python.org‘、‘www.python.org‘和‘python.org‘。
(7)‘^http‘只能匹配所有以‘http‘开头的字符串。
(8)(pattern)*:允许模式重复0次或多次。
(9)(pattern)+:允许模式重复1次或多次。
(10)(pattern){m,n}:允许模式重复m~n次。
(11)‘(a|b) * c‘:匹配多个(包含0个)a或b,后面紧跟一个c。
(12)‘ab{1,}‘:等价于‘ab+‘,匹配以字母a开头后面带1个或多个字母b的字符串。
(13)‘^[a-zA-Z]{1}([a-zA-Z0-9._]){4,19}$‘匹配长度为5~20的字符串,必须以字母开头,可带数字、"_"、"."的字符串。
(14)‘^(\w){6,20}$‘:匹配长度为6-20的字符串,可以包含字母、数字、下划线。
(15)‘^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$‘家畅给定字符串串是否为合法IP地址。
(16)‘^(13[4-9]\d{8})|(15[01289]\d{8})$‘检查给定字符串是否为移动手机号码。
(17)‘^[a-zA-Z]+$‘:检查给定字符串是否只包含英文字母大小写。
(18)‘^\[email protected](\w+\.)+w+$‘检查给定字符串是否为合法电子邮件地址。
(19)‘^(\-)? \d+(\. \d{1,2})? $‘:检查给定字符串是否为最多带有2位小数的正数或负数。
(20)‘[\u4e00-\u9fa5]‘:匹配给定字符串中的所有汉字。
(21)‘^\d{18}|\d{15} $‘:检查给定字符串是否为合法身份证格式。
(22)‘\d{4}-\d{1,2}-\d{1,2}‘:匹配指定格式的日期(2016-1-31)
(23)‘^(? = . * [a-z])(? = . * [A-Z])(? = . * \d)(? = . * [,._]) . {8,} $‘:检查给定字符串是否为强密码,必须同时包含英文大写字母、英文小写字母、数字或特殊符号(如英文逗号、英文句号、下划线),并且长度至少8位。
(24)"(?!. * [\‘\"\/;=%?).+":如果给定字符串中包含‘\"、/、;、=、%、?则匹配失败。
(25)‘(.)\\1+‘:匹配任意字符的一次货多次重复出现。
(26)‘((? P<f> \b\w+\b)\s+(? P=f))‘:匹配连续出现两次的单词。
注意:正则表达式只是进行形式上的检查,并不保证内容一定正确。
正则表达式使用圆括号“()”表示一个子模式,圆括号内的内容作为一个整体出现,例如,“(red)+”可以匹配redred、redredred等多个重复red的情况。使用子模式扩展语法可以实现更加复杂的字符串处理,常用的扩展语法如下:
语法 | 功能说明 |
(? P<groupname>) | 为子模式命名 |
(? iLmsux) |
设置匹配标志,可以是几个字母的组合 每个字母含义与编译标志相同 |
(? :...) | 匹配单不捕获该匹配的子表达式 |
(? P=groupname) | 表示在此之前的命名为groupname的子模式 |
(? #...) | 表示注释 |
( ? = ...) | 用于正则表达式之后,表示如果“=”后的内容在字符串中出现则匹配,但不返回“=”之后的内容 |
( ? ! ...) | 用于正则表达式之后,表示如果“!”后的内容在字符串中不出现则匹配,但不返回“!”之后的内容 |
(? <=....) | 用于正则表达式之前,与(?=...)含义相同 |
(? <! ...) | 用于正则表达式之前,与(?! ...)含义相同 |
小提示:正则表达式语法实在是太多了,很难全部记住。我个人建议:学会学习和学会思考比学会知识更加重要,大家要做一个“知识分子”,遇到问题之后要知道解决问题的大致思路和方向,具体的细节(比如函数用法和参数)可以通过搜索或查看帮助文档来解决,不需要(也不可能)把一切都记到脑子里。善于搜索能让我们更快地解决问题,站在巨人的肩膀上才能事半功倍。当然,必要的基础知识还是要掌握和熟悉的,不然很难判断搜索到的内容是否正确,毕竟网上的资料实在是太杂乱了。