给出一个像这样的字符串:
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();
    }

}

java – 如何在没有StringTokenizer的字符串中替换令牌的更多相关文章

  1. swift给String增加substring方法

    javascript中的str.slice(1,-1)在swift中要写成str.substringFromIndex(str.startIndex.advancedBy(1),str.endindex.advancedBy(-1)),是不是很恐怖幸运的是我们可以给swift内置类型增加任意的方法(好比在javascript的prototype上增加方法),比如这里给String增加了substr

  2. swift 中 UIColor 的一个简单扩展 UIColor+Extension

    完整代码使用举例RGBA十六进制颜色

  3. Swift3.1字符串截取操作

  4. Swift4 'substring(to:)' is deprecated: Please use String slicing subscript with a 'partial range upt

    解决Swift4substringdeprecated:PleaseuseStringslicingsubscriptwitha‘partialrangeupto’operator.

  5. macos – CKQueryOperation queryCompletionBlock只运行3次

    我正在尝试使用CloudKit和光标从我的iCloud公共数据库下载一批记录.无论resultLimit如何设置,代码都可以在前3次执行中正常工作,但是从不执行第4个完成块.如果没有设置resultsLimit,我会得到300条记录,如果它设置为50,我会得到150,如果它设置为5,我得到15…关于如何进行的任何想法?

  6. android – 如何在ViewPager中使用cursorLoader?

    解决方法我无法评论,所以我正在写一个答案..您有一个实现LoaderCallbacks的活动.加载数据时,您的活动会收到onLoadFinished回调.在此方法中,您有一个应该在ViewPager中显示的Cursor.要显示Cursor中的数据,请在适配器上调用swapCursor方法.因此,每次加载数据时都不要创建适配器.创建一次,然后只需调用swapCursor即可.此外,每次都找不到ViewPager–findViewById是一个繁重的操作,它应该在创建视图层次结构后执行.所以,你的onLoad

  7. android – 如何使用Cursor Adapter刷新listView

    我使用CursorAdapter创建了一个ListView.现在我正在尝试更新ListView并将值刷新到ListView.但我无法弄明白.如何使用Loader或changeCursor()来刷新我的ListView下面是我设置CursorAdapter的代码://SucessFully在这里完成我的按钮onClick我正在将值更新到数据库中//SucessFully完成我的UpdateData方法:CursorDemo类任何帮助都得到赞赏……});解决方法如果CursorDemo扩展了CursorAda

  8. android – 使用Cursor和ListView适配器获取大量数据

    我可以使这也在后台运行或以任何方式提高响应能力?

  9. android – 在contentProvider中选择前n行

    我选择这个:使用ContentQueyMap,我可以缓存Cursor数据并在Cursor关闭的情况下迭代它.现在,我想要选择Corsor只检索前五十行.在mQueryMap.getRows().entrySet()中循环50次的解决方案是不正确的:我不希望mQueryMap获取Cursor的所有行,但只有前五十行.任何的想法?是否存在where子句只能获得前n行?解决方法你可以做到排序后“LIMITx”.干杯

  10. android – 为什么cursorLoader没有通知源数据的变化?

    我有一个简单的contentProvider,一个带有ListView的布局和一个用于在内容Provider和CursorLoader中添加Items的按钮.http://developer.android.com/reference/android/app/LoaderManager.LoaderCallbacks.html#onLoadFinished(android.content.Load

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部