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

Matcher, find and replace placeholders with values

我有一个输入字符串,类似于带有占位符的查询,像这样

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

现在我的任务是用输入的内容替换那些占位符,输入变量与占位符同名,所以变量 test 应该替换占位符 $$test$$,变量 test2 应该替换占位符 $$测试 2$$

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

    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 但它在第一次替换所有占位符所以甚至找不到其他占位符。

我希望这很清楚,很难解释。我来这里是为了任何解释。

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, "");
    }
    m.appendTail(sql);
    System.out.println(sql);

你可以试试这个。

思路是把变量名和变量值放到一个Map中,然后用Matcher#appendReplacement根据变量名在map中查找变量数据。下面的代码是前面答案的组合:

// 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("\(.*?)\").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