正则表达式是什么
它可以用来查找某些有复杂规则的字符串,是描述文本规则的代码
有哪些规则
元字符:
\b
,代表单词的开头和结尾,是单词的分界处。.
,匹配除了换行符以外的任意字符*
,代表的是数量,*
前面的内容可以连续重复使用\w
,匹配字母或数组或下划线或汉字\s
,匹配任意的空白符\d
,匹配数字^
,匹配字符串的开始$
,匹配字符串的结束
字符转义
如果要查找元字符本身,比如查找.
或者*
,需要用\
取消字符的特殊意义
重复
*
,0个或多个+
,一个或多个?
,0个或一个{n}
,n多个{n,}
,n个或多个{n,m}
,n到m个
字符
元字符不包括的字符用[]
一个个列出来
如:[aeiou]
匹配aeiou中任意一个,[!?.]
同理
也可以指定范围[0-9]``[a-z0-9A-Z]
分枝条件
|
分隔左右两边,如0\d{2}-\d{8}|\(\0d{2}\)-\d{8}
匹配023-12345678
或(012)-12345678
要注意左右顺序,左边匹配上就不会匹配右边
分组
用括号括起来,比如想匹配重复三次的0.123
,(0\.\d{3}){3}
反义
除xxx之外的所有任意字符
\W
,匹配所有不是字母或数组或下划线或汉字的字符\S
,匹配所有不是任意的空白符的字符\D
,匹配所有不是数字的字符\B
,匹配不是单词的开头和结尾的位置[^x]
,匹配除了x以外的任意字符[^aeiou]
,匹配除了aeiou这几个字符以外的任意字符
后向引用
后向引用用于重复搜索前面某个分组匹配的文本
分组从左到右依次为1,2,3...
\b(\w+)\b\s+\1\b
,\1
代表分组1匹配的文本
就是引用了括号里的结果
当然后向引用可以指定别名。
如(?<Word>\w+)
,\w+
是这一组中对匹配的内容,Word
是别名,引用它可以使用\k<Word>
。<Word>
也可以写成'Word'
关于小括号的使用
以下exp
代表表达式
捕获
(exp)
,前面用过的,分组,组名是自动命名的1234(?<name>exp)
,给分组取别名(?:exp)
,不捕获匹配的文本,也不分配组好
零宽断言
断定一个东西必出现
分两种
零宽度正预测先行断言:(?=exp)
,断定自身出现位置后面一定会有这个exp
里匹配的内容。所以匹配到的结果反而是前面的内容
零宽度正回顾后发断言:(?<=exp)
,断定自身出现位置的前面一定会出现exp
匹配到的内容。所以匹配到的结果反而是后面的内容
另外还有负向零宽断言
零宽度负预测先行断言:(?!exp)
,断言此位置后面一定不会出现exp
匹配到的内容
零宽度负回顾后发断言:(?<!exp)
,断言此位置前面一定不会出现exp
匹配到的内容
注释
正则的注释可以用(?#comment)
贪婪与懒惰
贪婪匹配
如a.*b
懒惰匹配
如a.*?b
懒惰限定符
*?
尽可能少的重复+?
一个或多个,但是尽可能少的重复??
重复0或1次,尽可能少重复{n,m}?
重复n到m次,尽可能少重复{n,}?
重复n次以上,尽可能少重复
平衡组/递归匹配
(?'group')
把捕获的内容命名为group,并压入堆栈(Stack)(?'-group')
从堆栈上弹出最后压入堆栈的名为group的捕获内容,如果堆栈本来为空,则本分组的匹配失败(?(group)yes|no)
如果堆栈上存在以名为group的捕获内容的话,继续匹配yes部分的表达式,否则继续匹配no部分(?!)
零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败
平衡组的一个最常见的应用就是匹配HTML,下面这个例子可以匹配嵌套的<div>
标签:<div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>.