Java-код для сохранения специальных символов при произвольном вводе

1

Я работаю с программой 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. Возможно, я могу сделать текст электронной почты открытым текстом, но я не уверен, что моя компания хочет.

  • 1
    stackoverflow.com/questions/1732348/...
  • 0
    Хех, воу, это ... ну, я бы хотел знать это. Спасибо! Я думаю, что это немного облегчает, но проблема остается в попытке сформировать электронное письмо с пользовательским контентом, основанным на уникальных строках.
Показать ещё 2 комментария
Теги:
struts2

1 ответ

0
Лучший ответ

Это не очень, но то, что я в конечном итоге делает использовал StringBuilder в parseline метод для формирования HTML, при этом включены пользовательские переменные.

Впоследствии я могу включить FreeMarker, поскольку он уже включен в ядро Struts2, но поскольку сообщение электронной почты настолько просто (и вряд ли изменится в стиле или контенте в ближайшее время), этого пока достаточно.

Спасибо за предложения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню