Skip to content
This repository has been archived by the owner on Sep 6, 2020. It is now read-only.

正则表达式教程

John Smith edited this page Apr 5, 2017 · 5 revisions

什么是正则表达式

正则表达式(以下简称正则)是一种工具,一种用来搜索和替换文本的工具。

正则可以匹配具有一定格式的文本。

对于本软件来说,正则是一种精确过滤广告内容的强大工具,利用它可以精确识别广告。

初识正则

借贷广告

某大学生贷款广告,每次都是随机ID+随机头像+随机标题+随机内容+3张图片。

因为广告党对图片使用了gif格式,并且随机在中间插入乱码帧干扰图片相似度检测,违规图片过滤无效。

如果利用等级过滤,则误伤严重,人工审核工作量太大(如果吧里活跃度比较高的话)

这时我们发现,他每次的回复里都有XXXX年X月X日XX时XX分XX秒这句话。虽然没法用一般规则过滤,如果我们使用正则:

\d+年\d+月\d+日\d+时\d+分\d+秒

就可以对它进行过滤,因为一般人在帖子里写这种格式的文本基本不存在,所以可以利用它实现自动过滤。

开始学习之前

学习正则之前有几句话想说:

  1. 正则其实很好学,不是什么高深的东西(涉及知识最多到高一学历)。
  2. 正则其实不难,真正的挑战是如何在实际中找出广告的规律,并用正则解决问题。
  3. 使用正则时你会发现,几乎所有问题都有不止一种解决方案,他们有的简单,有的快速,有的准确,有的更好看懂。
  4. 写一个可以匹配你期望内容的正则很容易,写一个匹配你期望内容的正则很难。
  5. 这个网站可以帮助你测试你的正则在线正则表达式测试

超容易的正则教程

新手向,正则写的属于注重容易理解向,
所以在表达和逻辑上比较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,}的懒惰匹配版本