正则表达式记录

曾在某课网看过些视频,然后聊起正则就想到鬼斧神工这几个字。。视频里还说正则是计算机科学界的一朵奇葩。。好久没用了,于是做个写个总结来记录下,当然也查阅了一些文档和请教了些大神。

基本的原子

  • \w 代表一个0-9,a-z,A-Z,_的任意一个字符
  • \s 代表一个看不见的原子,空格、换行、tab
  • \n 代表换行符
  • \b 代表一个单词边界(字母和空格之间的边界,不是空格)
  • \d 代表一个数字
  • . 代表除换行符以外(\n)的任意字符

自定义匹配任意一个的方法

  • [abc] 可以匹配abc中任意一个字符
  • [^abc] 可以匹配除abc以外的任意一个字符(包括\s能匹配的字符)
  • [a-f0-9] 可以匹配a-f和0-9中任意一个字符

设置匹配次数

  • {2} 设置匹配次数为2
  • {2,5} 设置匹配次数为2到5
  • {1,} 设置匹配次数为1次或多次
  • ? 设置匹配次数为0-1次,相当于{0,1}
  • + 设置匹配次数为1次或以上,相当于{1,}
  • * 设置酦醅次数为0次以上,相当于{0,}

贪婪匹配

贪婪匹配:\w+ 会匹配后面所以符合要求的字符
非贪婪匹配:\w+? 会匹配后面尽可能少的字符
下面都用这个字符串来做例子 abbcbcbb

1
2
a.+c 会匹配到abbcbc
a.+?c 会匹配到abbc

然后来看看本质是怎么匹配的
贪婪匹配是匹配了所有合适字符再回头匹配,同样上面例子

1
2
3
匹配了a.+之后,会匹配到abbcbcbb
然后回溯查找c,由于b前面还是b,匹陪到的.会减一个,成了abbcbcb
接下来匹配c,好的,b前面刚好是c,匹配到的字符成了abbcbc,结束

非贪婪匹配是匹配了最少的字符在向下匹配,同样上面例子

1
2
3
匹配了a.+?之后,会匹配到ab
然后查找匹配c,由于b后面还是b,查找不到c,会继续匹配.,也就成了abb
接下来在匹配c,好的,下一个正是c,匹配到的字符成了abbc,结束.

分组

分组应该是正则最有意思的东西了。
分组用()来作为一组的单位,我们也可以叫它为一个子串

1
(mz)(\w.+?)(mz)

这一条正则语句有三个子串,然后假如我们想把匹配到的内容的第二个子串改成“我自己的内容”,我们可以这么做

1
str.replace(/(mz)(\w.+?)(mz)/gi,'$1我自己的内容$3')

是的,replace函数允许我们对分组进行引用,引用形式就是$index,index为第几个分组
分组不仅允许我们在匹配完成后引用,也可以在匹配时引用

1
(['"])(.*?)(\1)

可以匹配”‘hello’”,通过+index来表示引用的分组,index为第几个分组

一些常用的规则

  • ^ 匹配输入字符串的开始位置
  • $ 匹配输入字符串末尾位置
  • | 表示或关系

如果遇到一些关键字的话,我们需要用\来转义
以上是对正则的一些小总结