2012-02-05 69 views
12

去除「FWD」,「RE」等,我想清理它,擺脫「Re:」,「Fwd」和其他垃圾。例如,「[Fwd] Re:傑克和吉爾的婚禮」應該變成「傑克和吉爾的婚禮」。正則表達式/代碼從電子郵件主題

有人必須這樣做過,所以我希望你可以指向我的戰鬥測試正則表達式或代碼。

下面是一些需要清理的例子,發現於this page。該頁面上的正則表達式工作得很好,但並不完全在那裏。

Fwd : Re : Re: Many 
Re : Re: Many 
Re : : Re: Many 
Re:: Many 
Re; Many 
: noah - should not match anything 
RE-- 
RE: : Presidential Ballots for Florida 
[RE: (no subject)] 
Request - should not match anything 
this is the subject (fwd) 
Re: [Fwd: ] Blonde Joke 
Re: [Fwd: [Fwd: FW: Policy]] 
Re: Fwd: [Fwd: FW: "Drink Plenty of Water"] 
FW: FW: (fwd) FW: Warning from XYZ... 
FW: (Fwd) (Fwd) 
Fwd: [Fwd: [Fwd: Big, Bad Surf Moving]] 
FW: [Fwd: Fw: drawing by a school age child in PA (fwd)] 
Re: Fwd 
+2

'轉發:回覆:FWD是一個縮寫(四輪驅動)' – 2012-02-05 22:41:27

回答

13

試試這個(用「」代替):

/([\[\(] *)?(RE|FWD?) *([-:;)\]][ :;\])-]*|$)|\]+ *$/igm 

(如果你把每科通過其自己的字符串,那麼你不需要m改性劑;這只是讓$比賽結束對於多行字符串輸入而言,不僅僅是字符串的結尾)。

看到它在行動here

正則表達式的說明:

([\[\(] *)?   # starting [ or (, followed by optional spaces 
(RE|FWD?) *   # RE or FW or FWD, followed by optional spaces 
([-:;)\]][ :;\])-]*|$) # only count it as a Re or FWD if it is followed by 
         # : or - or ; or ] or) or end of line 
         # (and after that you can have more of these symbols with 
         # spaces in between) 
|      # OR 
\]+ *$     # match any trailing \] at end of line 
         # (we assume the brackets() occur around a whole Re/Fwd 
         # but the square brackets [] occur around the whole 
         # subject line) 

標誌。 :大小寫不敏感。

g:全局匹配(匹配所有可以找到的Re/Fwd)。

m:讓正則表達式中的'$'與多行輸入的行尾匹配,而不僅僅是字符串的結尾(只有當您將所有輸入主題一次輸入到正則表達式時才相關)如果您輸入一個每次的話你可以刪除它,因爲行尾字符串結尾)。根據國家/語言

+0

不錯。感謝regxr.com指針,這看起來很有用。 – Parand 2012-02-06 21:32:17

+3

這個正則表達式與「軟件」末尾的「re」錯誤匹配。取出'| $'將修復它,但隨後它將不再匹配「正向」在結束「回覆:FWD」。 – wmorgan 2012-05-16 21:59:33

+4

在'(RE | FWD?)的前面加上'\ B''照顧那 - 良好的漁獲物。 – 2012-05-16 23:37:04

2

下面的正則表達式將以我期望的方式匹配所有的情況。我不確定你是否會同意,因爲並非每一個案件都有明確的記錄。幾乎可以簡化這一點,但它是功能性的:

/^((\[(re|fw(d)?)\s*\]|[\[]?(re|fw(d)?))\s*[\:\;]\s*([\]]\s?)*|\(fw(d)?\)\s*)*([^\[\]]*)[\]]*/i 

比賽的最終結果將是剝離的主題。

+0

另外,請注意,我已經不匹配了啓動和關閉括號,所以你可能不希望同樣的結局,那就是你有一個不匹配數打開和關閉方括號。 – SimonMayer 2012-02-05 23:13:16

8

若干變化(題目前綴):Wikipedia: List of email subject abbreviations

巴西:RES === RE, 德語:AW === RE

實施例中的Python:

#!/usr/local/bin/python 
# -*- coding: utf-8 -*- 
import re 
p = re.compile('([\[\(] *)?(RE?S?|FYI|RIF|I|FS|VB|RV|ENC|ODP|PD|YNT|ILT|SV|VS|VL|AW|WG|ΑΠ|ΣΧΕΤ|ΠΡΘ|תגובה|הועבר|主題|轉發|FWD?) *([-:;)\]][ :;\])-]*|$)|\]+ *$', re.IGNORECASE) 
print p.sub('', 'RE: Tagon8 Inc.').strip() 

實施例在PHP:

$subject = "主題: Tagon8 - test php"; 
$subject = preg_replace("/([\[\(] *)?(RE?S?|FYI|RIF|I|FS|VB|RV|ENC|ODP|PD|YNT|ILT|SV|VS|VL|AW|WG|ΑΠ|ΣΧΕΤ|ΠΡΘ|תגובה|הועבר|主題|轉發|FWD?) *([-:;)\]][ :;\])-]*|$)|\]+ *$/im", '', $subject); 
var_dump(trim($subject)); 

終端:

$ python test.py 
Tagon8 Inc. 
$ php test.php 
string(17) "Tagon8 - test php" 

注意:這是mathematical.coffee的正則表達式。從其他語言 添加其他前綴: 中國,丹麥挪威語,芬蘭語,法語,德語,希臘語,希伯來語,意大利語,冰島語,瑞典語,葡萄牙語,波蘭語,土耳其語

我用「條/修剪」來刪除空格

+0

你的正則表達式是不固定,因此它從字符串剔除*所有*「RE」的出現?如果您嘗試使用'RE:Tagon8 Inc.Re'的主題行,您可以返回'Tagon8Inc.'。正則表達式實際上應該是'^([\ [\(*)(RE S |???FYI | RIF | I | FS | VB | RV | ENC | ODP | PD | YNT | ILT | SV | VS | VL ?| AW | WG |αΠ|ΣΧΕΤ|ΠΡΘ|תגובה|הועבר|主題|轉發| FWD)*([ - :;)\] [:; \]) - ] * | $)| \] + * $ ' – 2017-11-03 21:46:09

相關問題