Я работаю с программой Struts2, которая строит сообщение электронной почты с использованием файла шаблона электронной почты и заменяет определенные строки-заполнители в шаблоне с использованием пользовательского ввода, полученного через поле формы. Проект JavaMail используется для формирования электронной почты.
Вот как это выглядит:
InputStream in = getClass().getResourceAsStream("emailTemplate.html");
Scanner scanner = new Scanner( in );
String content = "";
while( scanner.hasNextLine() ) {
content += parseLine( scanner.nextLine() );
}
// ...
email.setHtmlContent( content );
Метод parseLine
выглядит следующим образом:
String emailReqNum = //internal code to return number from form;
String emailCompDate = //internal code to return date from form;
String emailComment = //internal code to return comment from form;
String emailStatus = //internal code to return status from form;
String emailServer = //internal code to return server from form;
line = line.replaceAll( "\\[REQUEST NUMBER\\]", emailReqNum );
line = line.replaceAll( "\\[ESTIMATED COMPLETION DATE\\]", emailCompDate );
line = line.replaceAll( "\\[COMMENT\\]", emailComment );
line = line.replaceAll( "\\[STATUS\\]", emailStatus );
line = line.replaceAll( "\\[SERVER\\]", emailServer );
И вот какая часть шаблона электронной почты выглядит так:
<table>
<tr><td><b>Request Number:</b></td><td>[REQUEST NUMBER]</td></tr>
<tr><td><b>Est. Completion Date:</b></td><td>[ESTIMATED COMPLETION DATE]</td></tr>
<tr><td><b>Comment:</b></td><td>[COMMENT]</td></tr>
<tr><td><b>Status:</b></td><td>[STATUS]</td></tr>
</table>
Проблема в том, что всякий раз, когда пользователь вводит специальный символ RegEx (\ ^ $. |? * + ( ) [ ] { }
) В поле комментария, он разрывает методы replaceAll
:
Exception in thread "main" java.lang.IllegalArgumentException: Illegal group reference
at java.util.regex.Matcher.appendReplacement(Matcher.java:725)
at java.util.regex.Matcher.replaceAll(Matcher.java:825)
at java.lang.String.replaceAll(String.java:1572)
Я пробовал заменять каждый из оскорбительных спецсимволов экранированной версией, но это, похоже, не работало, и выглядит уродливо как грех:
String filtered = emailComment;
filtered.replaceAll("\\","\\\\");
filtered.replaceAll("\\^","\\\\^");
filtered.replaceAll("\\$","\\\\$");
filtered.replaceAll("\\.","\\\\.");
filtered.replaceAll("\\|","\\\\|");
filtered.replaceAll("\\?","\\\\?");
filtered.replaceAll("\\*","\\\\*");
filtered.replaceAll("\\+","\\\\+");
filtered.replaceAll("\\(","\\\\(");
filtered.replaceAll("\\)","\\\\)");
filtered.replaceAll("\\[","\\\\[");
filtered.replaceAll("\\]","\\\\]");
filtered.replaceAll("\\{","\\\\{");
filtered.replaceAll("\\}","\\\\}");
Я тоже обманул себя петлями.
То, что я в конечном счете пытаюсь сделать, - это просмотреть введенные пользователем комментарии, найти какие-либо специальные символы и, возможно, изменить их так, чтобы метод replaceAll вызывал в parseLine (выше) работу успешно, чтобы заменить комментарий в содержимом электронной почты. Есть идеи?
Благодарю!
РЕДАКТИРОВАТЬ:
Думаю, имеет смысл, что HTML не может быть эффективно проанализирован с помощью RegEx. Возможно, я могу сделать текст электронной почты открытым текстом, но я не уверен, что моя компания хочет.
Это не очень, но то, что я в конечном итоге делает использовал StringBuilder
в parseline
метод для формирования HTML, при этом включены пользовательские переменные.
Впоследствии я могу включить FreeMarker, поскольку он уже включен в ядро Struts2, но поскольку сообщение электронной почты настолько просто (и вряд ли изменится в стиле или контенте в ближайшее время), этого пока достаточно.
Спасибо за предложения.