首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matcher,用值查找占位符并替换占位符。

Matcher,用值查找占位符并替换占位符。
EN

Stack Overflow用户
提问于 2017-04-13 08:28:16
回答 2查看 1.2K关注 0票数 2

我有一个输入字符串,它类似于带有占位符的查询,如下所示

代码语言:javascript
复制
#input String queryText, test, test2
//queryText is something like " SELECT stuff FROM stufftable WHERE oid_2 = $$test$$ || oid_2 = $$test2$$

现在我的任务是用输入的内容替换这些占位符,输入变量具有相同的占位符名称,因此变量测试应该替换占位符$$test$$,变量test2应该替换占位符$$test2$$。

这是我写下来的测试

代码语言:javascript
复制
    final List<String> list = new LinkedList<String>();
    Pattern pattern = Pattern.compile(/\$\$(.*?)\$\$/)
    Matcher matcher = pattern.matcher(queryText)
    log.debug(pattern)

    while (matcher.find()) {
        list.add(matcher.group(1));
        String text = matcher.group(1)
    log.debug(list)
    log.debug(text)
    }

我从日志中得到的输出如下:

代码语言:javascript
复制
\$\$(.*?)\$\$
[test]
test
[test, test2]
test2

因此,占位符在组中被正确地找到,我错过的部分是如何将值替换为它们。我尝试过.replaceFirst,但是它会在一段时间内循环,我尝试过.replaceAll,但是它第一次替换了所有的占位符,所以其他的都找不到。

我希望这是清楚的,很难解释。我是来找你解释的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-13 09:20:18

其思想是将变量名称及其值放置到Map中,然后使用Matcher#appendReplacement通过变量名在映射中查找变量数据。下面的代码是前面回答的内容的组合:

代码语言:javascript
复制
// Input:
String queryText = " SELECT stuff FROM stufftable WHERE oid_2 = $$test$$ || oid_2 = $$test2$$"; 
String test = "1";
String test2 = "2";
Map<String, String> map = new HashMap<>();
map.put("test", test);
map.put("test2", test2);

StringBuffer result = new StringBuffer();
Matcher m = Pattern.compile("\\${2}(.*?)\\${2}").matcher(queryText);
while (m.find()) {
    if (!m.group(1).isEmpty()) {
        m.appendReplacement(result, map.get(m.group(1)));
    }
    else {
       m.appendReplacement(result, m.group(0));
    }
}
m.appendTail(result);
System.out.println(result.toString());
// => SELECT stuff FROM stufftable WHERE oid_2 = 1 || oid_2 = 2

Java演示

在Groovy中,它非常简单

代码语言:javascript
复制
String test = "1";
String test2 = "2";
Map map = ["test":test, "test2":test2];
String txt = 'WHERE oid_2 = $$test$$ || oid_2 = $$test2$$';
print txt.replaceAll(/\$\$(.*?)\$\$/) { k -> map[k[1]] ?: k[0] }

Groovy演示

票数 1
EN

Stack Overflow用户

发布于 2017-04-13 08:54:46

代码语言:javascript
复制
String queryText = "SELECT stuff FROM stufftable WHERE oid_2 = $$test$$ || oid_2 = $$test2$$";
    String regex="\\$+(.*?)\\$+";
    Matcher m=Pattern.compile(regex).matcher(queryText);
    StringBuffer sql=new StringBuffer();
    while (m.find()) {
       m.appendReplacement(sql, "$1");
    }
    m.appendTail(sql);
    System.out.println(sql);

你可以试试这个。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43387152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档