RegEx 比对 - Regular Expression / 正规表示法 或 常规表示法 邮件过滤的终极武器
快速分类速查 RegEx 的概念 完整的 RegEx 规则 RegEx比对之使用教学
A. Regular Expression (RE) 的概念:
从 Wikipedia 的解释中来看:“正规表式(英语:Regular Expression、regex或regexp,缩写为RE),也译为正规表示法、常规表示法,在电脑科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字串的单个字串。”
如何将 Regular Expression 应用在邮件过滤上?您一定很好奇 Regular Expression 和一般的字串比对有什么不一样?由下面的范例,我们能看到 RE 在字串组合上比一般的字串灵活的多:(此范例要做“主旨”的比对)
1. 一般字串:我是广告信 → 一般字串一次只能表达一个意思,那“你是广告信”“他是广告信”等等怎么办?势必要多写几个规则才能将所有的可能字串添入过滤机制。
2. RE 字串:{[(你)|(我)|(他)].*是[(垃圾信件)|(广告信)|(垃圾信)]} → 一个 RE 字串就能够表达:你是垃圾信件 / 我是垃圾信件 / 他是广告信 / 你是垃圾信。。。等等各种不同组合。
从上面的范例,我们能清楚了解:利用 RE 来合并一些模拟两可及某些垃圾信惯用的多重组合字串是非常有效率的。您不需要一一地列出所有字串可能。下面我们在来一个范例:
1. {[(槟榔辣妹)|(正妹)|(西施)].*(买一粒送两粒)} → 槟榔辣妹买一粒送两粒 / 槟榔正妹买一粒送两粒 / 槟榔西施买一粒送两粒
B. 完整的 Regular Expression 规则:
以下的语法适用于撰写字串式子:(EVO 支援 unicode RegEx 可能和 Java 或 Perl 版本不尽相同,但大致上语法是大同小异的)
1. ' . ' 句号 (period) 代表任意一个字元,且皆可被当作过滤条件。
2. ' [ ] ' 中括号 (brackets) 内的任何一个字元皆可被当作过滤条件。
3. ' ^ ' (carat) Ⅰ. 若是在中刮号之内时表示中刮号内的字元为无效字元,例如:[^abc] 表示除了'a','b','c'以外的其他字元皆可当作过滤条件;Ⅱ. 若是在一个 RE 的开头,例如:^[abc],表示只有以 'a','b','c' 做为开头的字串能当作过滤条件。
4. ' - ' 连字号 (dash) 在中刮号之内注记字元范围的符号,例如:[0-9]表示任何 0 到 9 的字元皆能当作过滤条件。
5. ' ? ' 问号 (question mark) 过滤条件中,位于此符号之前的一个子运算式可出现 0 次或 1 次,例如: '2' 或 '12' 皆符合 '[0-9][0-9]?' 的条件。
6. ' + ' 加号 (plus sign) 过滤条件中,位于此符号之前的一个子运算式可出现 1 次或多次,例如: '1'、'13'、'456' 或甚至更多组合皆符合 '[0-9][0-9]+' 的条件。
7. ' * ' 星号 (asterisk) 过滤条件中,位于此符号之前的一个子运算式可出现 0 次或多次,例如: '2' 或 '123' 或甚至更多组合皆符合 '[0-9][0-9]*' 的条件。
8. ' ( ) ' 小刮号 (parathesis) 如同数学运算式中的小括号将运算子 (operator) 整合再一起优先处理,例如:(\d+,)*\d+ 符合一串用逗点分隔的整数 1 或 1,23,456。
9. ' { } ' 大刮号 (curly-braces) 此符号内包含一组过滤条件,例如:{(\b*\c\d\d\d\d\d\d\d\d\d\b*)}。
10. ' \ ' 反斜线 (back slash) 解译为 Ⅰ. 跳脱符号,若字元为特殊符号,可用反斜线还原该特殊符号的字面意思,例如:[0-9]+ 本为“0 到 9 的字元可多次出现”,若加入反斜线,[0-9]\+ 的 + 则直译为“加号”的意思;Ⅱ. 缩写符号,反斜线后若是预设的英文字母则代表特殊定义的语法,例如:\a 解译为“任何英文字母或数字字元 → [(a-zA-Z0-9)]”,细节请参考“缩写定义列表”。3. 比对字串群组指定符号,反斜线后若是一个整数数字(从 0 开始),可指定过滤条件总成中的某一组比对字串,例如:<{.*?}>.*?\0>中的 \0 的值为 {.*?} 的内容如 <head>Contents</head>。
11. ' $ ' 钱号 (dollar-sign) 此符号的前一个字元可当作过滤条件的结尾,例如:[0-9]$ 表示任何 0 到 9 的字元皆能当作过滤条件的结尾。
12. ' | ' 替代选项符号,用以分隔两个过滤条件字串,例如:T|the 可代表 The 或 the。
13. ' ! ' 惊叹号 (explamation mark),惊叹号之前和之后过滤条件若不相同时,则符合过滤条件。例如:a!b 为 a 后面面不是 b。
以下的语法适用于撰写比对字串时可搭配的不同类别字元的缩写符号:
1. ' \a ' 代表任何字母与数字符号,例如:[a-zA-Z0-9]
2. ' \b ' 代表空格,例如:[ \\t]
3. ' \c ' 代表任何字母符号,例如:[a-zA-Z]
4. ' \d ' 代表任何十进位的数字,例如:[0-9]
5. ' \h ' 代表任何十六进位的数字,例如:[0-9a-fA-F]
6. ' \n ' 代表换行符号
7. ' \q ' 代表双引号
8. ' \w ' 代表一个单字,例如:[a-zA-Z]+
9. ' \z ' 代表一个整数,例如:[0-9]+
C. RegEx 比对之使用教学
首先,在 EVO 邮件服务器软件中的邮件过滤页面拉下“规则决策设定”并选至“RegEx比对”,如下图:
下一步,在右手边的栏位输入 RegEx 的过滤字串,如下图:
现在我们将先前在邮件过滤页面中的范例“RegEx 最佳化”:
范例 1. 防止同事收到主旨含有 sex 的垃圾信 |
|
原比对字串:sex | RegEx 比对字串: {[sS][eE][xX]}|{[pP][oO][rR][nN]} |
使用 RegEx 能够 1. 过滤大小写混合组成的单字,例如:sEx, SEX, seX 等等;2. 同类型的过滤字串可放在同一个规则中,例如:sex & porn | |
范例 2. 将离职同事 Candy 的信件暂时性的转到指定的帐号信箱及文件夹 (代收) ;帐号还在的时候 |
|
原比对字串:Candy | RegEx 比对字串:{candy}|{sandy} |
使用 RegEx 能够多位离职的同事的新信件暂时性的转到指定的帐号与所属文件夹 | |
范例 3. 锁定某个垃圾信源的 IP 地址 123.123.123.123 挡住并移至 SPAM |
|
原比对字串:123.123.123.123 | RegEx 比对字串:{123\.123\.}|{111\.122\.} |
使用 RegEx 能够 1. 过滤一个网络区块的 IP 地址,例如:123.123.*.*;2. 可在一个规则中过滤多组区块的 IP 地址 | |
范例 4. 检查同事的外寄信件内文可能有重要个资,如:某人的身分证字号。若没问题 ,请使用“基本邮件过滤范例 5” |
|
原比对字串:Z123456789 | RegEx 比对字串:{.*\c\d\d\d\d\d\d\d\d\d.*} |
使用 RegEx 能够将所有疑似身份证字号的字串格式为“1 个英文字母搭配九个数字”,例如:a123456789,都过滤出来 | |
范例 5. 怀疑某同事 Alex 将公司文件顺便寄复本给同业比如 microsoft, 若没问题 ,请使用“基本邮件过滤范例 5” |
|
原比对字串:microsoft.com | RegEx 比对字串:{@microsoft\.com\.*\c*\c*}|{@ibm\.com\.*\c*\c*} |
使用 RegEx 能够 1. 可在一个规则中过滤多组域名;2. 除了基本的 xyz.com 之外,国家代号也不漏掉,例如:.tw | |
范例 6. 怀疑某同事 Alex 将公司文件顺便寄复本给同业比如 microsoft, 若没问题 ,请使用“基本邮件过滤范例 5” |
|
原比对字串:microsoft.com | RegEx 比对字串:{ab\a*@microsoft\.com\.*\c*\c*}|{(ab\a*@ibm\.com\.*\c*\c*} |
使用 RegEx 能够过滤域名之前的帐户名称的前面几个字元,,例如:只记得帐号前面两个字元,例如: [email protected],其他字元开头的帐户不会被过滤且收得到邮件。 | |
范例 7. 领导希望收到信件时,自动归类 pchome 的 好康报报 |
|
原比对字串:pchome | RegEx 比对字串:{PChome[(生活好康报)(每日限量快报)]}|{淘宝网}|{[(露天)(Yahoo!奇摩)]拍卖} |
使用 RegEx 能够集合各家网上购物的电子报并直接归类到邮件信箱中的指定文件夹 | |
范例 8. 同事抱怨收到那种很多垃圾字元的标题信,例如: | |
原比对字串:|h|i|h|o|w | RegEx 比对字串:{\|.\|.\|.\|}|{.o.o.o.o.}|{.c.c.c.c.}|{.0.0.0.0} |
使用 RegEx 能够用 ' . ' 符号代替任何一个字元。一般比对字串输入什么就比对什么,若垃圾符号之间的字元变化无常,先前的比对字串可能在未来垃圾信中不再出现,就没有意义了。必须时常修正,效率欠佳。 | |
范例 9. 客服人员有时因为客户态度差,可能在回信中加三字经等问候字语,事后后悔并想阻挡该信件寄出 |
|
原比对字串:三字经等问候语 | RegEx 比对字串:{[fF][uU][xX][kK].*[yU]*[oO]*[uU]}|{[xX].*[xX].*[xX]}|{王X蛋} |
使用 RegEx 能够过滤多组不雅的三字经问候语,字串中的 xX 为马赛克过的三字经问候语,意会即可。 |