前言
这篇博客是我对正则表达式一些基础知识的整理。
基础部分
1.1 什么是正则表达式
是一种特殊的字符串模式
作用是匹配字符串
如同用模具做产品,正则表达式就是模具,具体的字符串就是产品
定义一种规则去匹配复合规则的字符串
1.2 元字符介绍
“^” : ^会匹配行或者字符串的开头,有时会匹配整个文档的起始位置
“$”: $匹配字符串的结尾。
“\b”: 单词的边界,如在字符串“i am a boy”,单独匹配单词“boy”需要“\bboy\b”,
\b不会匹配boy两边的字符,但会识别boy两边是否为字符的边界。
“\d”: 匹配数字
“\w”: 匹配数字,字母和下划线
“\s”: 匹配空格
“.”: 匹配除了换行符以外的所有字符,相当于”\w”的加强版,”\w”不能匹配空格
“[abc]”: 匹配包含括号内元素的字符,只匹配括号内存在的字符
1.3 几种反义
“\W”: 匹配任意不是字母,数字,下划线的字符
“\S”: 匹配任意不是空白符的字符
“\D”: 匹配任意非数字的字符
“\B”: 匹配不是单词开头或结束的位置
“[^abc]”: 匹配了除了abc以外的任意字符
1.4 量词
贪婪:如“*”字符,贪婪量词会首先匹配整一个字符串,尝试匹配时,它会尽可能地匹配每一个字符,如果失败则回退(回溯)一个字符,直到找到可以匹配的字符或者没有字符可以回退。相比下面量词,它的消耗是最大的。
懒惰:如“?”它从目标的起始位置开始尝试匹配,每次检查一个字符,并寻找它要匹配的内容,它会一直匹配到字符串结尾处。
“*”: 重复零次或更多,例如“aaaab”匹配字符串中所有的a,正则:“a*”
“+”:重复一次或更多
“?”:重复零次或一次
“{n}”:重复n次,例如从“aaaab”中匹配a并重复2次,正则:“a{2}”
“{n,m}”:重复最少n次最多m次
“{n,}”:重复n次或更多次,例如电话号码:0123-4567890,格式为0***-*******, 正则:“^0\d{3}-\d{7}$”
1.5 懒惰限定符
“*?”:重复任意次,但尽可能少,例如“aaaaab”正则:“a*?b”,原本可以取到全部的字符a,但因为尽可能少的匹配,所以最后得到“ab”
“+?”:重复一次以上,但尽可能少
“??”重复零次或一次,但尽可能少
“{n,m}”:重复n次到m次,但尽可能少
“{n,}”:重复n次以上,但尽可能少
进阶部分:
2.1 捕获分组
捕获数组:如(\d),可以对捕获分组进行向后引用,如(\d)\d\1这里的“\1”就是对(“\d”)的后向引用。
下面为捕获分组常用的方法:
“(exp)”:匹配exp,并捕获文本到自动命名的组里
“(?<arrayName>exp)”:匹配exp,捕获文本到名为arrayName的组里
“(?:exp)”:匹配exp,不捕获文本,也不创建组
2.2 零宽断言
“(?=exp)”:也叫零宽正预测先行断言,匹配exp前面的文本,例如“how are you”,正则:“(?<txt>.+(?=ing))”,这里取ing前面所有的字符,并定义一个捕获分组,该分组名为txt,分组内的值是ing前面的字符。
“(?<=exp)”: 也叫零宽正回顾后发断言,匹配exp后面的文本:例如“how are you”,正则:“(?<txt>(?<=how).+)”,这里取how后面的所有字符,并定义一个捕获分组为txt
“(?!exp)”
2.3 负向零宽断言
(?!exp):后面跟不是exp的文本,例如“aaa123”正则:“aaa(?![1-9])”,匹配aaa后非数字的结果
(?!<exp):前面不是exp的文本