1. 语法
1.1 元字符
字符 | 描述 |
---|---|
\ | 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如: \n 匹配一个换行符 |
^ | 匹配输入字符串的开始位置 |
$ | 匹配输入字符串的结束位置 |
* | 匹配前面的子表达式零次或多次。例如 zo*能匹配 z 以及 zoo |
+ | 匹配前面的子表达式一次或多次。例如 zo*能匹配 zo 以及 zoo,不能匹配 z |
? | 匹配前面的子表达式零次或一次。例如 do(es)?可以匹配 do 或 does |
{n} | n是非负整数。匹配确定的n次。例如 o{2} 不能匹配 Bob 中的 o,但是能匹配 food 中的两个 o |
{n,} | n是一个非负整数。至少匹配n次。例如 o{2} 不能匹配 Bob 中的 o,但是能匹配 fooooood 中所有 o |
{n,m} | m和n均为非负整数,n<=m。最少匹配 n 次且最多匹配 m 次,注意逗号和两个数之间不能有空格 |
? | 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少得匹配所搜索的字符串。默认的贪婪模式则尽可能多地匹配所搜索的字符串 |
. | 匹配除换行符(\r,\n)之外的任何单个字符。如果要匹配包括换行符在内的任何字符,可使用(.|\n)这种模式 |
(pattern) | 子表达式,匹配pattern并获取这一匹配。所获取的匹配从产生的Matches集合中得到(用 \n n为数字表示前面第n个组的结果),匹配圆括号需要转义 |
(?:pattern) | 匹配pattern但是不获取匹配结果 |
(?=pattern) | 正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,非获取匹配。例如 "Windows(?=95|98|NT|2000)"能匹配 “Windows2000"中的Windows 但是不能匹配"Windows3.1"中的"Windows”。预查不消耗字符,即预查的下一次匹配不是从包含预查的字符之后开始 |
(?!pattern) | 正向否定预查,非获取匹配。在任何不匹配pattern的字符串开始处匹配查找字符串。例如 "Windows(?=95|98|NT|2000)"能匹配 “Windows3.1"中的Windows 但是不能匹配"Windows2000"中的"Windows” |
(?<=pattern) | 反向肯定预查,与正向肯定预查类似,只是方向相反。例如 “(?<95|98|2000)Windows"能匹配"2000Windows"中的"Windows”,但不能匹配"3.1Windows"中的"Windows" |
(?<!pattern) | 反向否定预查,与正向否定预查类似 |
x|y | 匹配 x 或 y |
[xyz] | 字符集合。匹配所包含的任意一个字符 |
[^xyz] | 负值字符集合。匹配未包含的任意字符 |
[a-z] | 字符范围。匹配指定范围内的任意字符 |
[^a-z] | 负值字符范围。匹配任何不在指定范围内的任意字符 |
\b | 匹配一个单词边界。例如er\b可以匹配never中的er,匹配不到verb中的er |
\B | 匹配非单词边界 |
\cx | 匹配由x指明的控制字符。(????????) |
\d | 匹配一个数字字符。等价于[0-9] |
\D | 匹配一个非数字字符。等价于[^0-9] |
\f | 匹配一个换页符。等价于 \x0a和\cL |
\n | 匹配一个换行符 |
\r | 匹配一个回车符 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等。等价于[ \f\n\r\t\v] |
\S | 匹配任何非空白字符 |
\t | 匹配一个制表符 |
\v | 匹配一个垂直制表符 |
\w | 匹配字母数字下划线 |
\W | 匹配非字母、数字、下划线 |
\xn | 匹配n,其中n为十六进制转义值,必须是确定的两个数字长。例如 \x41匹配 “A” |
\un | 匹配n, 其中n是一个用4个十六进制数字表示的Unicode字符。 |
1.2 运算优先级
最高到最低如下:
运算符 | 描述 |
---|---|
\ | 转义符 |
(), (?: ) ,(?=),[] | 圆括号和方括号 |
*,+,?,{n},{n,},{n,m} | 限定符 |
^,$,\任何元字符、任何字符 | 定位点和序列 |
| | 或操作 |
1.3 匹配规则
- 基本模式匹配
什么叫模式?就是一组描述字符串特征的字符,是正则表达式最基本的元素。
例如:^once
可匹配once开头的字符串,once
可匹配出现once的字符串 - 字符簇
例如:元音字符的字符簇 [AEIOUaeiou],小写字母的字符簇[a-z]
需要注意的是这个模式只能表示一个字符,例如^[a-z][0-9]$
匹配由一个小写字母和一个数字组成的字符串,可匹配 “t5”,但不能匹配诸如"tt5"等。
注意:以[1-5]这种方式指定范围时,开始值和结束值两者都包括在范围内,按照Unicode排序顺序,开始值必须在结束值的前面。 - 确定重复出现
跟在字符或字符簇后面的花括号{}用来确定前面的内容重复出现的次数,例如:
^a{4}$
匹配 aaaa
^a{2,4}$
匹配 aa、aaa 或者 aaaa
^a{2,}$
匹配 包含多余两个a的字符串
2. 示例
以下两个例子很好得说明了正向肯定预查的用法:
- 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间)
^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9]{8,10}$ - 强密码(必须包含大小写字母和数字的组合,可以使用特殊字符,长度在8-10之间)
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
其他比较有用的正则表达式
- 钱的输入格式:
有四种钱的标识形式我们可以接受:“10000.00”, “10,000.00”, “10000”, “10,000”
^([0-9]+)(\.[0-9]{1,2})?$ - 中文字符
[\u4e00-\u9fa5] - 空白行
\n\s*\r - HTML标记
<(\S*?)[^>]*>.*?<.*?/> - IP地址
((25[0-5]|2[0-4]\d|[1]?\d?\d)\.){3}(25[0-5]|2[0-4]\d|[1]?\d?\d)