-
Notifications
You must be signed in to change notification settings - Fork 43
正则表达式教程
正则表达式(以下简称正则)是一种工具,一种用来搜索和替换文本的工具。
正则可以匹配具有一定格式的文本。
对于本软件来说,正则是一种精确过滤广告内容的强大工具,利用它可以精确识别广告。
某大学生贷款广告,每次都是随机ID+随机头像+随机标题+随机内容+3张图片。
因为广告党对图片使用了gif格式,并且随机在中间插入乱码帧干扰图片相似度检测,违规图片过滤无效。
如果利用等级过滤,则误伤严重,人工审核工作量太大(如果吧里活跃度比较高的话)
这时我们发现,他每次的回复里都有XXXX年X月X日XX时XX分XX秒这句话。虽然没法用一般规则过滤,如果我们使用正则:
\d+年\d+月\d+日\d+时\d+分\d+秒
就可以对它进行过滤,因为一般人在帖子里写这种格式的文本基本不存在,所以可以利用它实现自动过滤。
学习正则之前有几句话想说:
- 正则其实很好学,不是什么高深的东西(涉及知识最多到高一学历)。
- 正则其实不难,真正的挑战是如何在实际中找出广告的规律,并用正则解决问题。
- 使用正则时你会发现,几乎所有问题都有不止一种解决方案,他们有的简单,有的快速,有的准确,有的更好看懂。
- 写一个可以匹配你期望内容的正则很容易,写一个只匹配你期望内容的正则很难。
- 这个网站可以帮助你测试你的正则在线正则表达式测试
新手向,正则写的属于注重容易理解向,
所以在表达和逻辑上比较Low,大佬不要吐槽有更容易的方法什么的。
比如\d会写成[0-9],*和+会写成{0,}和{1,}
- 正则里只有几样东西和字面意思不一样
. * ? ^ $ + \ | 八个英文符号(后边两个符号在你键盘回车上边一点位置)
() [] {} 三种英文括号
其他和文字表面意思一模一样,你原来不用正则时怎么写就还怎么写
上边的符号如果需要表示字面的意思,前边加个\
比如网址
https://www.baidu.com?url=qq.com
需要写成
https://www\.baidu\.com\?url=qq\.com
- {X,Y} 匹配{}之前的那个东西X到Y次
比如 蛤{2,4} 就是匹配: 蛤蛤、蛤蛤蛤、蛤蛤蛤 三种
如果不写Y就是大于等于X次, 比如 蛤{2,} 就是匹配: 蛤蛤、蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤...直到无限长
- [ABCD] 建立一个匹配集合(整个正则里涉及最高学历的知识)
比如 [ABCDEFG]可以匹配字母A到G的任何字母
如果你想匹配A到Z任何一个字母,又不想从A到Z都都打一次可以直接写[A-Z]。 匹配所有字母是[A-Za-z],匹配所有数字是[0-9],匹配汉字是[\u4e00-\u9fa5](包含2W多个汉字,实际上汉字目前拥有的编码是7.5W个,想看全部区间的见附录吧)
结合2与3,那么匹配QQ号(8位到10位数字)就是
[1-9][0-9]{7,9}
意思就是 第一个数字是1-9(QQ号没0开头的) 然后后边跟了7~9位数字。
- . 可以匹配除了回车换行以外任何东西
所有有些用符号吧铭感词隔开的回复,比如 吧0务a草#泥%马
直接写成
吧.{1}务.{1}草.{1}泥.{1}马
只要汉字还是这五个字,中间字符是一个,随便变都能检测到。
变种:有些可能既会写:吧0务a草#泥%马,还可能写 :吧0务a泥%马,可能有草字可能没有。
那么写成
吧.{1}务.{1}草{0,1}.{0,1}泥.{1}马
{0,1}意味着草字可以出现一次,也可以不出现。
完整元字符见正则表达式手册
元字符 | 说明 |
---|---|
. | 匹配换行符以外的任何字符 |
| | 逻辑或操作符 |
[] | 匹配字符集合中的一个字符 |
[^] | 对字符集合求非 |
- | 定义一个区间 |
\ | 对下个字符转义 |
元字符 | 说明 | 举例 |
---|---|---|
* | 匹配前一个字符零次或几次。 | "微信号*"可以匹配"微信"、"微信号号" |
*? | *的懒惰匹配版本 | |
+ | 匹配前一个字符一次或多次 | "微信号+"可以匹配"微信号号",但不匹配"微信" |
+? | +的懒惰匹配版本 | |
? | 匹配前一个字符零次或一次 | "加我?微信号?"可以匹配"加微信" |
{n} | 匹配前一个字符或子表达式正好n次 | |
{n,} | 匹配前一个字符或子表达式至少n次 | |
{n,m} | 匹配前一个字符或子表达式n到m次 | |
{n,}? | {n,}的懒惰匹配版本 |