2016-03-30 3 views
0

Я пытаюсь создать регулярное выражение для удаления тегов интерполяции Freemarker в String. У меня есть шаблон с текстом и интерполяциями как "Hi customer, we remember your appointment ${date?string["dd"]}"Java regexp для удаления тегов интерполяции Freemarker

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

String myString = "Hi customer, we remember your appointment ${date?string["dd"]}" 

myString = myString.replaceAll(Pattern.quote("${date?string[\"dd\"]}"), "xx"); 

, но не работает. Где я делаю ошибку?

+0

Я лично не знаю, как исправить ваш RegEx, но вы всегда можете проверить образцы RegEx здесь https://regex101.com/ – freddiev4

ответ

1

Не забудьте присвоить возвращаемое значение replaceAll метода исходной строки в качестве replaceAll (или любого другого String API) не изменяет основной неизменный объект типа String:

String myString = "Hi customer, we remember your appointment ${date?string[\"dd\"]}"; 

myString = myString.replaceAll(Pattern.quote("${date?string[\"dd\"]}"), "xx"); 
//=> Hi customer, we remember your appointment xx 
0

Использования регулярных выражений, вы могли бы сделать :

String myString = "Hi customer, we remember your appointment ${date?string[\"dd\"]}"; 
myString = myString.replaceAll("\\$\\{date\\?string\\[\"dd\"\\]\\}", "xx"); 

Результирующая строка:

Hi customer, we remember your appointment xx 
0

Я разделяю строку на 4 логические группы, а затем собираю требуемый контент вместе.

Попробуйте следующее регулярное выражение:

(.*?)(?:\$\{.*?\"([^\"]+).{3})(.*) 

Пример:

String text = "Hi customer, we remember your appointment ${date?string[\"dd\"]}"; 
String replacement_text = "xxx"; 

String rx = "(.*?)(?:\\$\\{.*?\"([^\"]+).{3})(.*)"; 

Pattern regex = Pattern.compile(rx, Pattern.CASE_INSENSITIVE | Pattern.MULTILINE); 
Matcher regexMatcher = regex.matcher(text); 
String result = regexMatcher.replaceAll("$1" + replacement_text + "$3"); 

System.out.println(result); 

Код будет испускать:

Hi customer, we remember your appointment xxx 

Однако, если вы хотите извлечь содержимое маркера т.е. dd, просто замените значение replacement_text с $2, и вы получите

Hi customer, we remember your appointment dd 
Смежные вопросы