匹配器,查找和替换占位符的值

时间:2017-04-13 08:28:17

标签: regex replace find matcher

我有一个输入字符串,就像一个带占位符的查询,就像这个

#input String queryText, test, test2
//queryText is something like " SELECT stuff FROM stufftable WHERE oid_2 = $$test$$ || oid_2 = $$test2$$

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

这是我作为测试写下的内容

    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)
    }

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

\$\$(.*?)\$\$
[test]
test
[test, test2]
test2

因此,在组中正确找到占位符,我想念的部分是如何将值替换为它们。我已经尝试过.replaceFirst,但是它会在一段时间内循环播放,我已经尝试过.replaceAll但它会在第一时间取代所有占位符,所以其他占位符甚至都找不到。

我希望它清楚,很难解释。我在这里有任何解释。

2 个答案:

答案 0 :(得分:1)

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 :(得分:1)

我们的想法是将变量名称及其值放到Map,然后使用Matcher#appendReplacement通过变量名称在地图中查找变量数据。下面的代码是以前答案的组合:

// 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 demo

在Groovy中,它就像

一样简单
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 demo