Regex/код для удаления "FWD", "RE" и т.д. Из темы электронной почты

Учитывая тему сообщения по электронной почте, я хотел бы очистить ее, избавиться от "Re:", "Fwd" и другого барахла. Так, например, "[Fwd] Re: Jack and Jill Wedding" должен превратиться в "Свадьба Джека и Джилла".

Кто-то, должно быть, сделал это раньше, поэтому я надеюсь, что вы можете указать мне на бой с регулярным выражением или кодом.

Вот несколько примеров того, что нужно очистить, найти на этой странице. Регулярное выражение на этой странице работает достаточно хорошо, но не полностью.

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

Ответ 1

Попробуйте это (замените на ''):

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

(Если вы помещаете каждый объект в свою собственную строку, вам не нужен модификатор m, это просто так, что $ соответствует концу строки, а не только концу строки, для многострочных строковых вводов).

Смотрите в действии здесь.

Объяснение регулярного выражения:

([\[\(] *)?            # 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)

Flags.

i: регистр нечувствителен к регистру.

g: глобальное совпадение (соответствует всем Re/Fwd, который вы можете найти).

m: пусть "$" в регулярном выражении совпадает с концом строки для многострочного ввода, а не только для конца строки (имеет значение только в том случае, если вы одновременно загружаете все ваши объекты ввода в регулярное выражение. один предмет каждый раз, тогда вы можете удалить его, потому что конец строки - конец строки).

Ответ 2

Несколько вариантов (префикс субъекта) в зависимости от страны/языка: Википедия: список сокращений по темам электронной почты

Бразилия: 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. Добавлены другие префиксы с других языков: Китайский, датский, норвежский, финский, французский, немецкий, греческий, иврит, итальянский, исландский, шведский, португальский, польский, турецкий

Я использовал "strip/trim" для удаления пробелов

Ответ 3

Следующее регулярное выражение будет соответствовать всем случаям так, как я ожидал бы этого. Я не уверен, согласитесь ли вы, потому что не каждый случай явно задокументирован. Это почти наверняка можно упростить, но оно функционально:

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

Конечный результат в матче будет разделенным субъектом.