正则表达式4种预查的作用
(?=pattern) (?!pattern) (?<=pattern) (?<!pattern)
刚开始学习正则表达式的时候看着最蒙逼的4个表达式, 小括号中带着问号, 一脸蒙逼不知道是写的啥, 也没整明白效果是啥. 后来终于在不断的看文档和尝试, 总算是搞明白了
预查表达式
预查表达式主要功能是起到 判断作用 , 类似于编程中的 if 判断语句, 判断当前匹配字符的左右内容是什么, 并且符合预查表达式内容的内容 不会被获取 .
在我们要匹配一些字符串的时候, 通常有些内容我们不需要匹配获取, 但是可以作为参考, 这个时候就可以使用预查表达式了. 例: 获取所有 括号之间的内容不包含括号 , 所有 双引号之间的内容 等.
方向
预查表达式可以看到有两个方向, 正向 和 反向. 通俗来说就是 当前字符判断位置 的 右边 和 左边.
4种表达式中 < 用来描述向左(反向), 没有 < 表示向右(正向)
当然这种写法也是固定的, 比如你写个(?<<=)就报错了.
肯定 和 否定
肯定用 = 号描述, 否定用 ! 号描述
这两种含义最简单的理解就是 是 和 不是
- bcd(?=123) 表示 获取 bcd 字符串并且该字符串右边一定是 123 字符串.
能匹配到bcd123 - bcd(?!123) 表示 获取 bcd 字符串, 并且该字符串右边一定不是 123
所以匹配到的内容一定不是bcd123, 可以是bcdasd, bcdbcd, bcd123… 反正bcd右边不是123的都行
各种刁钻的例子
- (?=abc)a 表示 获取 a 字符串, 并且从a字符串左边开始向右 为 abc
等统于 a(?=bc), 因为是从a字符左边开始向右, 所以会包含a字符. - (?<=123)abc 表示 获取字符串abc, 并且abc字符串的左边一定是123字符串
- abc(?<=123) 表示 获取字符串abc,并且从c字符右侧向左3个字符的字符串一定是123
因为c字符右侧开始向左3个字符和abc重叠了, 所以这个是表达式匹配不到任何字符串. - (?<=123)abc 表示 获取字符串abc, 并且从字符a左边开始向左3个字符一定是123.
字符串123abc 满足条件匹配成功, 并获取到的字符串是abc
正常一点的例子
- (?<=\()((?!\(|\)).)*(?=\)) 获取所有小括号中的内容
字符串 (aa)test(bb)test2(cc)test3(dd) 获得内容为4个字符串 aa bb cc dd - (?<=")\w*(?=") 获取双引号之间的字符串