java – 如何在没有StringTokenizer的字符串中替换令牌

给出一个像这样的字符串:
Hello {FirsT_NAME},this is a personalized message for you.

其中FirsT_NAME是任意令牌(传递给方法的地图中的一个键),要编写一个将该字符串变为:

Hello Jim,this is a personalized message for you.

给出了一个带有条目FirsT_NAME的地图 – >吉姆.

看起来StringTokenizer是最直接的方法,但Javadocs真的说你应该更喜欢使用正则表达式.您将如何在基于正则表达式的解决方案中执行此操作?

解决方法

尝试这个:

注意:author’s final solution建立在这个样本之上,更简洁.

public class TokenReplacer {

    private Pattern tokenPattern;

    public TokenReplacer() {
        tokenPattern = Pattern.compile("\\{([^}]+)\\}");
    }

    public String replacetokens(String text,Map<String,String> valuesByKey) {
        StringBuilder output = new StringBuilder();
        Matcher tokenMatcher = tokenPattern.matcher(text);

        int cursor = 0;
        while (tokenMatcher.find()) {
            // A token is defined as a sequence of the format "{...}".
            // A key is defined as the content between the brackets.
            int tokenStart = tokenMatcher.start();
            int tokenEnd = tokenMatcher.end();
            int keyStart = tokenMatcher.start(1);
            int keyEnd = tokenMatcher.end(1);

            output.append(text.substring(cursor,tokenStart));

            String token = text.substring(tokenStart,tokenEnd);
            String key = text.substring(keyStart,keyEnd);

            if (valuesByKey.containsKey(key)) {
                String value = valuesByKey.get(key);
                output.append(value);
            } else {
                output.append(token);
            }

            cursor = tokenEnd;
        }
        output.append(text.substring(cursor));

        return output.toString();
    }

}

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...