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 為馬賽克過的三字經問候語,意會即可。 |