正则表达式
元字符:
\d 匹配任意一个十进制数字,等价于[0-9]
\D 匹配任意一个除十进制数字以外字符,等价于[^0-9]
\s 匹配任意一个空白字符,比如换页符、换行符、回车符、制表符、垂直制表符
\S 匹配除空白字符以外的任何一个字符
\w 匹配任意一个单词字符、数字、字母或下划线
\W 匹配除数字、字母、下划线以外的任意一个字符
\b 匹配一个字边界,非数字、字母和下划线的字符都视为单词边界
\B 非字边界匹配
. 匹配除换行符以外的任意一个字符
* 匹配0次、或1次、或多次其前面的字符
+ 匹配1次或多次其前面的字符
? 匹配0次或1次其前面的字符,通过在 *或+ 之后再放一个?,表示从贪婪匹配转换为非贪婪匹配或者最小匹配。
{n} 表示其前面字符恰好出现n次
{n,} 表示其前面字符出现不少于n次
{n,m} 表示其前面的字符至少出现n次,最多出现m次
^或\A 匹配字符串开始位置
$或者\Z 匹配字符串的结束位置
| 匹配两个或多个模式
[] 匹配方括号中的任意一个字符
[^] 匹配除方括号中字符以外的任意一个字符
(exp):数字编号捕获分组
(?<name>exp):命名编号捕获分组
(?:exp):非捕获分组,表示不捕获该分组数据
(?=exp) 前瞻性捕获。从当前位置向后的剩余字符串是否有exp表达式匹配项,如果有则继续后续的匹配,如果没有结束匹配
(?=exp)本身不参与字符串的匹配,只是做一个是否继续匹配的检查判断 exp = /abc(?=[a-z]{3}\d)[a-z]*/ 匹配字符串"abcdxu6"返回abcdxu 匹配到abc之后,会向后作检查,在后续字符串"dxu6"中是否有/[a-z]{3}\d/的匹配项 发现有匹配项,然后继续向后[a-z]*匹配到dxu,最终返回abcdxu 前瞻性捕获在检测密码复杂度的时候经常使用 exp = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{6,20}/ 表示从开始位置检查,是否包含小写字母、大写字母和数字,包含则继续匹配,否则停止匹配
(?!exp) 和?=功能相反,表示后面的字符串没有匹配项才向后继续匹配
(?<=exp) 和?=的方向相反,检测从当前位置向前的字符串是否有匹配
(?<!exp) 和?<=功能相反,表示之前的字符串没有匹配项才向后继续匹配
反向引用
一个正则表达式中的捕获分组匹配会存储到一个缓冲区中
每个捕获分组的匹配都按照在正则表达式中从左到右出现的顺序存储,最多可存储99个捕获分组
数字编号捕获分组可以使用 '\n' 访问,其中n为第几个数字编号捕获分组,分组捕获编号从1开始,0表示完整的正则匹配
exp = /(\d)(\d)\d\2\1/ 匹配一个5位的回文数字
命名编号捕获分组可以使用 '\k
reg = /(?<one>\d)(?<two>\d)\d\k<two>\k<one>/
常见模式修正符
i 在和模式进行匹配时不区分大小写
g 表示全局匹配(php中默认全局匹配,JS中默认单次匹配)
m 多行匹配,如果目标字符串 中没有""字符, 或者模式中没有出现^或$, 设置这个修饰符不产生任何影响
s 如果设定了此修正符,那么.将匹配所有的字符包括换行符
U 禁止贪婪匹配
匹配汉字
在utf-8编码表中,汉字编码是比较奇特的,并不是连续的编在一起,如希伯来文U+0590-U+05FF(连续)
汉字被分成了很多小段,而且因为有很多汉字是中国、日本、韩国共享的,所以UTF8编码里面的CJK一般都是指汉字段。
经过核查,第一次出现CJK的是U+2E80,最后一次是U+FE4F
因此在正则中我们使用使用 [\u2e80-\uef4f] 来匹配中文是比较全面的(这个区间中会存在韩文、日文等文字)
还有一种比较偷懒的写法,就是我们的7000个通用汉字中按照编码的大小依次为:
一、丁、七、万、丈、三、......、龊、龋、龌龙、龚、龛、龟、龠
所以我们直接使用 [一-龠] 就可以匹配这7000个通用汉字
但是龠比较难写,所以写成 [一-龟] 就可以匹配除了龠之外的7000个通用汉字
还有一种写法,就是 [^\x00-\xff]
,这个匹配范围更广,几乎能匹配所有除了正则中元字符不能表达的所有字符
- 没有了
- 编程常用到的英文词汇