正则表示式速查

238 阅读2分钟

正则表达式是什么

它可以用来查找某些有复杂规则的字符串,是描述文本规则的代码

有哪些规则

元字符:

  1. \b,代表单词的开头和结尾,是单词的分界处。
  2. .,匹配除了换行符以外的任意字符
  3. *,代表的是数量,*前面的内容可以连续重复使用
  4. \w,匹配字母或数组或下划线或汉字
  5. \s,匹配任意的空白符
  6. \d,匹配数字
  7. ^,匹配字符串的开始
  8. $,匹配字符串的结束

字符转义

如果要查找元字符本身,比如查找.或者*,需要用\取消字符的特殊意义

重复

  1. *,0个或多个
  2. +,一个或多个
  3. ?,0个或一个
  4. {n},n多个
  5. {n,},n个或多个
  6. {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之外的所有任意字符

  1. \W,匹配所有不是字母或数组或下划线或汉字的字符
  2. \S,匹配所有不是任意的空白符的字符
  3. \D,匹配所有不是数字的字符
  4. \B,匹配不是单词的开头和结尾的位置
  5. [^x],匹配除了x以外的任意字符
  6. [^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>.

参考

参考链接