正则用途:分割 查找 匹配 替换
1 * + ?的区别
- *代表匹配任意次, 包括0,1,多次
- +代表匹配最少一次, 1或者多次
- ?代表匹配最多1次,0,1次
2 单次边界(\b和\B)
2.1 定义
首先说一下零宽: 只匹配位置, 不匹配字符,
然后我们再来谈单词边界:
何谓单词? 在JS中, 单词的定义就是\w也就是 [A-Za-z0-9_], 非单词的定义就是\W, 非常简洁.
何谓边界? 不同为之界. \w界\W, 也就是在这个位置之前是单词, 那么在这个位置之后就是非单词, 反之也是这样.
如下图,\b匹配的位置一共有4个,用flag替换后位置如下,详细解释下四个匹配到的位置原因(相邻的边界合为1个)
- 1的左边为开头,算一个边界,右边是2,都是\w,故右边没有
- 2的左边是1,相同,右边是3,相同
- 3的左边是2,相同,右边是逗号,逗号不属于\w,故3的右边有一个边界
- 逗号左边为3,算一个边界,这个位置上已经有一个了,故合并,右边为4,不同,故右边有一个边界
- 4的左边为逗号,算一个边界,这个位置上已经有一个了,故合并,右边为5,相同
- 5的左右两边都是数字
- 6的左边为数字,相同,右边为结尾,故有一个边界
2.2 使用场景
匹配apt
- 匹配 Chapter 中的字符串 apt,但不匹配 aptitude 中的字符串 apt, \Bapt
- 匹配 aptitude 中的字符串 apt,但不匹配 Chapter 中的字符串 apt, \bapt
3 ?=、?<=、?!、?<!作用
总的来说就是判断两个表达式关系的, 其实就是可能存在多个匹配结果,但是需要再过滤一下,
- exp1(?=exp2):查找 exp2 前面的 exp1。类似找以exp2结尾的,但不包括exp2
- (?<=exp2)exp1:查找 exp2 后面的 exp1。类似找以exp2开头的,但不包括exp2
- exp1(?!exp2):查找后面不是 exp2 的 exp1。
- (?<!exp2)exp1:查找前面不是 exp2 的 exp1。