2016-03-30 34 views
0

我想創建一個正則表達式來刪除字符串中的Freemarker插值標記。我有一個帶有文本和插值的模板"Hi customer, we remember your appointment ${date?string["dd"]}"Java的正則表達式來刪除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