#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/12.
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
Объяснение регулярного выражения:
(?mi)
указывает многострочный и нечувствительный к регистру.(fwd|re)
указываетfwd
илиre
.s*
задает любое количество пробелов.