Удалить Re: Fwd: из тем почты

#java #regex

#java #регулярное выражение

Вопрос:

Я пытаюсь создать регулярное выражение для удаления дополнительных ключевых слов из почтовых тем, добавляемых обычно почтовыми композиторами, такими как Fwd, Re: Но не могу придумать регулярное выражение, которое может удовлетворить все эти сценарии.

 Fwd : Re : Re: Many
Re : Re: Many
Re:    Re: Many
Re: Many
Re: Many
RE: Presidential Ballots for Florida
RE: (no subject)
Request - should not match anything
this is the subject
Re: Fwd
 

Я пытался использовать это регулярное выражение в Java:

 subject.replaceAll("^.{0,3}:s", "");
 

но это удаляет только первое найденное совпадение. Любое регулярное выражение, если оно может удовлетворить большинство распространенных сценариев, но не все вышеперечисленное также будет большим подспорьем. Я нашел несколько регулярных выражений для Python, но преобразовать их в Java довольно сложно. Любая помощь приветствуется.

Комментарии:

1.Вы можете удалить их все с помощью b(?:Fwd|Re)b(?:s*:s*)? regex101.com/r/ZfPWdF/1

2. subject = subject.replaceAll("(?mi)^(?:\h*(?:fwd|re)\h*) :\h*", "");

3. Небольшая поправка к моему предложению: .replaceAll("(?mi)^\h*(?:(?:fwd|re)\h*:\h*) ", "") см. демонстрацию . За последним Fwd не следует двоеточие, поэтому оно должно остаться.

Ответ №1:

Вы можете удалить вхождения, которые не только привязаны к началу строки, используя:

 b(?:Fwd|Re)bh*(?::h*)?
 

Демонстрация регулярных выражений

Обратите внимание, что это также будет соответствовать последней полной строке Re: Fwd


Если Fwd не должно совпадать (поэтому двоеточие не является необязательным) и привязано к началу строки:

 ^(?:(?:Fwd|Re)h*:h*) 
 

Объяснение

  • ^ Начало строки
  • (?: Не группа захвата
    • (?:Fwd|Re)h*:h* Сопоставьте либо Fwd или Re , за которым следует двоеточие между необязательными горизонтальными пробелами
  • ) Закройте группу без захвата и повторите 1 раз, чтобы получить все вхождения

Демонстрация регулярных выражений | Демонстрация Java

Пример

 String regex = "^(?:(?:Fwd|Re)\h*:\h*) ";
String string = "Fwd : Re : Re: Manyn"
       "Re : Re: Manyn"
       "Re:    Re: Manyn"
       "Re: Manyn"
       "Re: Manyn"
       "RE: Presidential Ballots for Floridan"
       "RE: (no subject)n"
       "Request - should not match anythingn"
       "this is the subjectn"
       "Re: Fwd";

Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(string);
String result = matcher.replaceAll("");

System.out.println(result);
 

Вывод

 Many
Many
Many
Many
Many
Presidential Ballots for Florida
(no subject)
Request - should not match anything
this is the subject
Fwd
 

Ответ №2:

Вы можете использовать регулярное выражение, ((?mi)(fwd|re)s*:s*)

 public class Main {
    public static void main(String[] args) {
        String s = "Fwd : Re : Re: Manyn"   
                "Re : Re: Manyn"   
                "Re:    Re: Manyn"   
                "Re: Manyn"   
                "Re: Manyn"   
                "RE: Presidential Ballots for Floridan"   
                "RE: (no subject)n"   
                "Request - should not match anythingn"   
                "this is the subjectn"   
                "Re: Fwd" ;
        
        System.out.println(s.replaceAll("((?mi)(fwd|re)\s*:\s*)", ""));   
    }
}
 

Вывод:

 Many
Many
Many
Many
Many
Presidential Ballots for Florida
(no subject)
Request - should not match anything
this is the subject
Fwd
 

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

  1. (?mi) указывает многострочный и нечувствительный к регистру.
  2. (fwd|re) указывает fwd или re .
  3. s* задает любое количество пробелов.