复习正则表达式(三)

Last modified date

今天继续回顾正则表达式。

1.边界操作符 \b
\babc\b:完整匹配含有abc字符串的字符。

\b操作符类似$ ^操作符,是一个边界控制的操作符。\B操作符也是边界控制的匹配操作符,但是\B操作符不是完全匹配整个字符串,它是在字符串中搜索匹配部分字符

2.反向引用
([abc])\1:反向应用通常是用来表示查找限定重复、查找或限定指定标识对的字符。

3.查找操作符
?= : 正向向前查找
例如: foo(?=bar) 表示匹配foo后面带有bar的foo 字符。
它能匹配 : foobar, xxxfoobar 中的 foo
但是匹配不了 : fooabc, fooxxx 这样的foo

?<= : 正向向后查找
(?<=foo)bar 表示匹配前面有foo的bar字符。
能匹配:foobar, xxxfoobar 中的bar
但是匹配不了: xxxbar中的bar

?! : 负向前查找
foo(?!bar) 匹配后面不带有bar的foo字符。
可以匹配 : foobar, fooxxx
匹配不了: foobar 这样的字符串。

?<! : 负向后查找
(?<!foo)bar 匹配前面没有foo的bar字符。
可以匹配: xxxbar中的bar字符
不可以匹配: foobar, 123foobar 中的bar字符。

这一部分比较复杂,主要是限定词这一部分比较绕,但是是非常有用的,特别是在后端日志搜索中。
学习正则表达式正确姿势,就是多练习、多运用,多花时间搞清楚正则的能力使用和原理。而且要熟悉自己使用语言的正则能力,每种语言都会有细微的用法区别和特性。

正则表达式的用途总结:
数据验证
数据爬取
数据转义(例如从符合数据中转义)
文本解析(例如:URL)
文本替换
语法高亮
文件重命名
数据包分析

最后欣赏一下上个月CloudFlare六年来首次宕机的元凶:
这条导致 CPU 耗尽的 WAF 规则中的正则表达式如下,这是一条会引起大量回溯的正则表达式:

(?:(?:\”|’|]|}|\|\d|(?:nan|infinity|true|false|null|undefined|symbol|math)|`|-|+)+[)];?((?:\s|-|~|!|{}||||+).(?:.=.*)))

淋雨