对于正则表达式,第一眼时觉得完全没有规律可寻,而且全是一堆各种各样的特殊符号,完全不知所云。其实唯一难的就是组合起来之后,可读性比较差,而且不容易理解,其实能看得懂简单的正则表达式,写得出简单的正则表达式,用以满足日常的需求即可。学习正则表达式的最好方法是从例子开始,理解例子之后再自己对例子进行修改实践。
一
正则表达式说明
正则表达式(regular expression)是一种特殊的字符串模式(pattern),用于匹配一组字符串,可以用来检查一个串是否含有某种子串,将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
通俗的说,正则表达式好比用模具做产品,而正则就是这个模具,定义一种规则去匹配符合规则的字符。
在线匹配工具:
http://www.regexpal.com/
http://rubular.com/
正则匹配软件:McTracer
3.正则匹配的用途
-
匹配验证: 判断给定的字符串是否符合正则表达式所指定的过滤规则,从而可以判断某个字符串的内容是否符合特定的规则(如email地址、手机号码等),当正则表达式用于匹配验证时,通常需要在正则表达式字符串的首部和尾部加上^和$,以匹配整个待验证的字符串。
-
查找与替换: 判断给定字符串中是否包含满足正则表达式所指定的匹配规则的子串,如查找一段文本中的所包含的IP地址。另外,还可以对查找到的子串进行内容替换。
字符串分割与子串截取: 基于子串查找功能还可以以符合正则表达式所指定的匹配规则的字符串作为分隔符对给定的字符串进行分割。
正则表达式简介
1.元字符
正则表达式中的字符分为 普通字符 和 元字符。大多数字符都将简单地匹配它们的自身值,它们被称为普通字符,如数字(0-9),字母(a-z, A-Z)等,除了特殊元字符之外的所有字符都是普通字符。
代码 | 说明 |
. | 匹配除换行符以外的任意字符 |
\ | 将下一个字符标记为一个特殊字符 |
\w | 匹配字母,数字,下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字,等价于[0-9] |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
[abc] |
字符组,匹配包含括号内元素的字符 |
2.反义字符
代码/语法 | 说明 |
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^abc] | 匹配除了abc字母以外的任意字符 |
3.字符次数匹配
贪婪(贪心) ,如"*"字符 贪婪量词会首先匹配整个字符串,尝试匹配时,它会选定尽可能多的内容,如果 失败则回退一个字符,然后再次尝试回退的过程就叫做回溯,它会每次回退一个字符,直到找到匹配的内容或者没有字符可以回退。相比下面两种贪婪量词对资源的消耗是最大的。
懒惰(勉强) 如 "?" 懒惰量词使用另一种方式匹配,它从目标的起始位置开始尝试匹配,每次检查一个字符,并寻找它要匹配的内容,如此循环直到字符结尾处。
占有 如"+" 占有量词会覆盖目标字符串,然后尝试寻找匹配内容 ,但它只尝试一次,不会回溯,就好比先抓一把石头,然后从石头中挑出黄金。
代码/语法 | 说明 |
* | 贪婪:重复零次或更多次 |
+ | 懒惰:重复一次或更多次 |
? | 占有:重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
4.懒惰限定符
代码/语法 | 说明 |
*? | 重复任意次,但尽可能少重复 |
+? | 重复1次或更多次,但尽可能少重复 |
?? | 重复0次或1次,但尽可能少重复 |
{n,m}? | 重复n到m次,但尽可能少重复 |
{n,}? | 重复n次以上,但尽可能少重复 |
贪婪模式与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配;非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。另外,非贪婪模式只被部分NFA引擎所支持。从匹配效率上来看,能达到相同匹配结果时,贪婪模式的匹配效率通常会比较高,因为它回溯过程会比较少。
5.捕获分组
代码/语法 | 说明 |
(exp) |
匹配exp,并捕获文本到自动命名的组里 |
(? |
匹配exp,并捕获文本到名称为name的组里 |
(?:exp) |
匹配exp,不捕获匹配的文本,也不给此分组分配组号 |
(?=exp) |
匹配exp前面的位置 |
(?<=exp) |
匹配exp后面的位置 |
(?!exp) |
匹配后面跟的不是exp的位置 |
(?<!exp) |
匹配前面不是exp的位置 |
正则表达式优先级
正则表达式从左到右进行计算,并遵循优先级顺序。相同优先级的从左到右进行运算,不同优先级的运算先高后低。
下表为从高到低排列各种正则表达式运算符的优先级顺序:
运算符 | 描述 |
\ | 转义符 |
(), (?:), (?=), [] | 圆括号和方括号 |
*, +, ?, {n}, {n,}, {n,m} | 限定符 |
^, $, \任何元字符、任何字符 | 定位点和序列(即:位置和顺序) |
| | 替换,"或"操作 |
正则表达式常用实例
1.匹配一个URL地址
http或http链接可以这样写:
(https?://)?[\S]+
2.匹配一个IP地址
简单写法:
(\d+[.]){3}\d+
严谨写法:
(((?:[1-9]\d?)|(?:1\d{2})|(?:2[0-4]\d)|(?:25[0-5]))[.]){3}((?:[1-9]\d?)|(?:1\d{2})|(?:2[0-4]\d)|(?:25[0-5]))
3.匹配一个邮箱地址
保证只出现一个@符:
[^\s@]+@[^\s@]+\.[^\s@]+
匹配网易邮箱:6-18个字符,只能包含字母、数字和下划线,且只能以字母开头
[a-zA-Z]\w{5,17}@(126|163)\.com
匹配qq邮箱:3-18个字符,只能包含字母、数字、点、减号和下划线
[\w.-]{3,18}@qq\.com
匹配网易邮箱和qq邮箱:
(?:[a-zA-Z]\w{5,17}@(126|163)\.com)|(?:[\w.-]{3,18}@qq\.com)
4.匹配密码是否合法
要求为非空字符且限定密码长度为6-18位
^\S[6-18]$
必须同时包含含数字、大小字母、小写字母和标点符号
(?=^.{6,8}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*\W+)
必须同时包含且只能包含数字、大小字母、小写字母和标点符号
(?=^[\d\Wa-zA-Z]{6,8}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*\W+)
5.匹配大陆身份证号
15位和18位身份证号
(\d{2}|\d{4})-((0?[1-9])|(1[0-2]))-((0?[1-9])|([12][0-9])|(3[01]))
6.匹配日期
年月日
(\d{2}|\d{4})-((0?[1-9])|(1[0-2]))-((0?[1-9])|([12][0-9])|(3[01]))
7.匹配24小时制时间
(((0?|1)[0-9])|(2[0-3])):([0-5][0-9]):([0-5][0-9])
8.匹配QQ号码
[1-9]\d{4,}
9.匹配手机号
1[356789]\d{9}
10.匹配大陆固定手机号
(\d{3,4}-)?\d{7,8}
11.匹配大陆邮政编码
\d{6}
12.其他常用正则表达式
匹配内容 | 正则表达式 |
汉字 | [\u4e00-\u9fa5] |
中文及全角标点符号 | [\u3000-\u301e\ufe10-\ufe19\ufe30-\ufe44\ufe50-\ufe6b\uff01-\uffee] |
不含abc的单词 | (?=\w+)(?!abc) |
正整数 | [1-9]+ |
负整数 | -[1-9]+ |
非负整数(正整数+0) | [1-9]+ |
非正整数(负整数+0) | -[1-9]+ |
整数+0 | -?[1-9]+ |
正浮点数 | \d+.\d+ |
负浮点数 | -\d+.\d+ |
浮点数 | -?\d+.\d+ |