replacement
部分replaceFirst(regex,replacement)
可以包含對regex
匹配的組的引用。要做到這一點,利用
$x
語法,其中x
是整數,表示羣號,
${name}
其中name
是因爲這種能力$
的命名組(?<name>...)
的名稱被視爲特殊字符在replacement
,所以如果你想使$
文字你需要
\
像replaceFirst(regex,"\\$whatever")
- 還是讓
Matcher
逃生爲你使用Matcher.quote
方法replaceFirst(regex,Matcher.quote("$whatever"))
,但你不應該使用
value = value.replaceFirst("\\{[sdf]\\}", "%" + i + "\\$s");
內循環,因爲每次你做它逃生,你需要遍歷整個字符串以找到你想要替換的部分,所以每次你需要從頭開始時,效率非常低。
正則表達式引擎在matcher.appendReplacement(StringBuffer, replacement)
和matcher.appendTail(StringBuffer)
的形式中爲此效率低下提供瞭解決方案。
appendReplacement
方法也加入到StringBuffer的所有數據,直到當前的比賽,並讓您指定要落實到位的正則表達式部分匹配
appendTail
增加了其存在後,最後匹配的部分
部分
所以,你的代碼應該看起來更像
StringBuffer sb = new StringBuffer();
int i = 0;
Matcher tagsMatcher = Pattern.compile("\\{[sdf]\\}").matcher(value);
while (tagsMatcher.find()) {
tagsMatcher.appendReplacement(sb, Matcher.quoteReplacement("%" + (i++) + "$s"));
}
value = sb.toString();
爲每一場比賽,它會做替換。那麼replaceFirst有什麼需要? –
根據您的代碼,您應該使用'matcher.appendReplacement'示例:http://stackoverflow.com/a/19645633/1393766 http://stackoverflow.com/a/25081783/1393766 – Pshemo