2012-02-05 71 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

相关问题