首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

正则表达式也是一段历史

说正则表达式之前,先看一段它的历史。

https://en.wikipedia.org/wiki/Walter_Pitts

https://en.wikipedia.org/wiki/Warren_Sturgis_McCulloch

https://en.wikipedia.org/wiki/Stephen_Cole_Kleene

在1951 年,一位名叫Stephen Kleene的数学科学家,他在Warren McCulloch和Walter Pitts早期工作的基础之上,发表了一篇题目是《神经网事件的表示法》的论文,利用称之为正则集合的数学符号来描述此模型,引入了正则表达式的概念。正则表达式被作为用来描述其称之为“正则集的代数”的一种表达式,因而采用了“正则表达式”这个术语。

日常waf的运维过程中,需要针对突发漏洞事件制定临时防护策略,需要根据公司实际场景优化现有的waf策略,这个时候,正则表达式大有用处,可以极大地减少策略制定的数量,增强waf的防御疗效,控制运维成本。

这个是菜鸟教程中的正则表达式教程:

http://www.runoob.com/regexp/regexp-tutorial.html

http://www.runoob.com/regexp/regexp-metachar.html

最初看这个教程,讲解不甚清晰,在正则表达式实践中发现了教程的一个不大的缺陷,毕竟是教程,全面覆盖没有错,但在实际运用中,是要有的放矢的。

对于正则表达式的元字符要分类解析,不同类型拆分开来,清晰可见,下面是工作中的一个内部分享。

假设现在有一个1.txt的文件,里面有很多单个字符串,我们现在的目的是快速找出那些我们想要的字符。

ab 包含ab的字符串,例如abc/1ab/wabc

第一部分

^ab 开头为ab的字符串,例如abc/abc1

ab$ 结尾为ab的字符串,例如qab/c1ab

^ab$ 开头和结尾都是ab,就是ab本身

ab. ab后面跟上一个字符,例如abc/ab1,这个点可以表示除\n(换行符)和\r(回车符)的任意字符

^a.b$ a为开头,b为结尾,中间是一个字符,例如a1b

ab* a后面跟0个及以上的b,例如a/ab/abb

ab.* ab后面跟0个及以上的字符,例如ab/abc/ab123

.*ab 表示ab为结尾,ab之前有0个及以上的字符,例如1ab/aab/1aaab

ab+a后面跟1个及以上的b,例如ab/abb

ab? a后面跟0个或者1个b,仅表示a/ab

ab\.php 表示ab.php,中间的点被反斜杠\转义了,例如ab\*表示ab*

第二部分

ab 表示a后面跟1个b,就是ab,数字只能是自然数

ab 表示a后面跟1到3个b,就是ab/abb/abbb三个

ab 表示a后面跟1个及以上的b,例如ab/abb/abbbbb

^.$ 表示3个字符的字符串,例如111/a1a/bbb

a|b 表示a或者b,例如a|b|2表示a/b/2三个中的一个

a|bc 表示a或者bc

(a|b)cd 表示acd/bcd两个中的一个

[ab]cd 表示acd/bcd两个中的一个

[^ab]cd 一定不能是acd/bcd中任一个

[a-z]ab 表示开头是a到z的字符,例如aab/zab/rab

[A-Z]ab 表示开头是A到Z的字符,例如Aab/Rab

[0-9]ab 表示开头是0到9的字符,例如0ab/7ab

第三部分

a\b \b是边界的意思,表示a字母为结尾的字符串

\ba 表示a字母为开头的字符串

a\B \B是不能为边界的意思,表示a字母不能为结尾的字符串

\Ba 表示a字母不能为开头的字符串

\d 表示[0-9]

\D 表示[^0-9]

\w 表示字母数字下划线,[A-Za-z0-9_],里面包含下划线

\W 表示[^A-Za-z0-9_],里面包含下划线

第四部分

\cx c表示ctrl的意思,x对应特定控制符,且必须为大小写字母

\f 换页符,对应\cL,a\fb表示ab之间有一个换页符,就是文档上下页之间的那个空字符

\n 换行符,对应\cJ,a\nb 表示ab之间有一个换行符,就是一行字符到头自动换到下一行间的空字符

\r 回车符,对应\cM,a\r\b表示ab之间有一个回车符,就是一行未到头,按enter换行的那个空字符

\t 水平制表符,对应\cI,a\tb表示ab之间有一个水平制表符,例如编程时的一个tab键表示4个空格,实现了一次水平制表符的移动

\v 垂直制表符,对应\cK,a\vb表示ab之间有一个垂直制表符,例如按向下/向上/向左/向右的任意一个箭头,都可以实现换一行从头输入

\s 匹配任何空白字符,等同于[\f\n\r\t\v]

\S 匹配任何非空白字符,与 \s正好相反

如果你看正则表达式的元字符时,会发现还有一些其它类型的,但是日常waf运维中很少涉及,所以暂且不表,其实上述正则表达式元字符也是日常编程中经常用到的。

实践可以加速正则表达式的掌握进程和牢靠程度。

下面有一个例子,可以根据上面知识点,逐个分析。

https://www.cnblogs.com/zhangbaochong/p/5308643.html

图片来自维基百科英文版

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190123G1FDFF00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券