String
を受け入れ、特定のトークンのインスタンス (例: ${fizz}
、${buzz}
、${foo}
など) を検査し、各トークンを からフェッチされた新しい文字列に置き換えるメソッドを作成しようとしていますMap<String,String>
。
たとえば、このメソッドに次の文字列を渡すと:
「どうだ ${fizz} 牛。${buzz} は変な形の ${foo} を持っていた。」
そして、メソッドが以下を参照した場合Map<String,String>
:
Key Value
==========================
"fizz" "brown"
"buzz" "arsonist"
"foo" "feet"
結果の文字列は次のようになります。
「なんてこった茶色の牛。放火犯は奇妙な形の足を持っていた。」
これが私の方法です:
String substituteAllTokens(Map<String,String> tokensMap, String toInspect) {
String regex = "\\$\\{([^}]*)\\}";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(toInspect);
while(matcher.find()) {
String token = matcher.group(); // Ex: ${fizz}
String tokenKey = matcher.group(1); // Ex: fizz
String replacementValue = null;
if(tokensMap.containsKey(tokenKey))
replacementValue = tokensMap.get(tokenKey);
else
throw new RuntimeException("String contained an unsupported token.");
toInspect = toInspect.replaceFirst(token, replacementValue);
}
return toInspect;
}
これを実行すると、次の例外が発生します。
Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal repetition near index 0
${fizz}
^
at java.util.regex.Pattern.error(Pattern.java:1730)
at java.util.regex.Pattern.closure(Pattern.java:2792)
at java.util.regex.Pattern.sequence(Pattern.java:1906)
at java.util.regex.Pattern.expr(Pattern.java:1769)
at java.util.regex.Pattern.compile(Pattern.java:1477)
at java.util.regex.Pattern.<init>(Pattern.java:1150)
at java.util.regex.Pattern.compile(Pattern.java:840)
at java.lang.String.replaceFirst(String.java:2158)
...rest of stack trace omitted for brevity (but available upon request!)
なぜ私はこれを手に入れたのですか?そして、正しい修正は何ですか?前もって感謝します!