2012-02-05 12 views
12

Dado un asunto del correo electrónico, me gustaría limpiarlo, deshacerme del "Re:", "Fwd" y otra basura. Entonces, por ejemplo, "[Fwd] Re: Jack y Jill's Wedding" debería convertirse en "Jack and Jill's Wedding".Regex/código para eliminar "FWD", "RE", etc., del asunto del correo electrónico

Alguien debe haber hecho esto antes, por lo que espero que pueda indicarme el código o la expresión regular de batalla probada.

Aquí hay algunos ejemplos de lo que debe limpiarse, que se encuentra en this page. La expresión regular en esa página funciona bastante bien, pero no está completamente allí.

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: Re: fwd es un acrónimo (tracción a las cuatro ruedas)' –

Respuesta

13

Prueba con esto (sustituir con ''):

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

(Si se pone cada tema a través de su propia cadena como a continuación, no es necesario el modificador m, esto es sólo para que $ partidos terminan de línea, no solo el final de la cadena, para las entradas de cadena de línea múltiple).

Véalo en acción here.

Explicación de expresiones regulares:

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

Banderas.

i: case insensitive.

g: coincidencia global (coincide con todos los Re/Fwd que puede encontrar).

m: deje que el '$' coincida con el final de línea para una entrada de varias líneas, no solo al final de la cadena (solo relevante si ingresa todos los temas de entrada a la expresión regular de inmediato). sujeto cada vez, luego puede eliminarlo porque el final de la línea es fin de la cadena).

+0

Agradable. Gracias por el puntero de regxr.com también, parece útil. – Parand

+3

Esta expresión regular coincide erróneamente con la "re" al final de "Software". Sacar el '| $' lo arreglará, pero luego ya no coincidirá con el "Fwd" al final de "Re: Fwd". – wmorgan

+4

Agregue un '\ b' delante del' (RE | FWD?) 'Para encargarse de eso - buena captura. –

2

La siguiente expresión regular coincidirá con todos los casos en la forma que esperaría que lo hiciera. No estoy seguro de si aceptará, porque no todos los casos han sido documentados explícitamente. Es casi seguro posible simplificar esto, pero es funcional:

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

El resultado final en el partido será objeto despojado.

+0

Además, tenga en cuenta que no he emparejado los corchetes de inicio y cierre, por lo que puede no esperar el mismo resultado, donde tiene un número inigualable de apertura y cierre de corchetes. – SimonMayer

8

Varias variaciones (Asunto prefijo) de acuerdo con el país/idioma: Wikipedia: List of email subject abbreviations

Brasil: RES === RE, alemán: AW === RE

Ejemplo en 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() 

Ejemplo en 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)); 

Terminal:

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

Nota: Esta es la expresión regular de mathematical.coffee. Añadido otros prefijos de otras lenguas: chino, danés noruego, finlandés, francés, alemán, griego, hebreo, italiano, islandés, sueco, portugués, polaco, turco

he usado "tira/ajuste" para eliminar espacios

+0

Su expresión regular no está anclada, por lo que elimina * todas * las apariciones de "RE" de la cadena. Si intenta una línea de asunto de 'RE: Tagon8 Inc.Re', obtendrá' Tagon8Inc'. La expresión regular debería ser '^ ([\ [\ (] *)? (RE? S? | FYI | RIF | I | FS | VB | RV | ENC | ODP | PD | YNT | ILT | SV | VS | VL | AW | WG | ΑΠ | ΠΡΘ | גג | גג | F | * | ה | 转发 | FWD?) * ([- :;) \]] [:; \]) -] * | $) | \] + * $ ' –

Cuestiones relacionadas