正则表达式是什么
它可以用来查找某些有复杂规则的字符串,是描述文本规则的代码
有哪些规则
元字符:
\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>.