我有一个输入字符串,它类似于带有占位符的查询,如下所示
#input String queryText, test, test2
//queryText is something like " SELECT stuff FROM stufftable WHERE oid_2 = $$test$$ || oid_2 = $$test2$$现在我的任务是用输入的内容替换这些占位符,输入变量具有相同的占位符名称,因此变量测试应该替换占位符$$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,但是它第一次替换了所有的占位符,所以其他的都找不到。
我希望这是清楚的,很难解释。我是来找你解释的。
发布于 2017-04-13 09:20:18
其思想是将变量名称及其值放置到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演示
在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] }发布于 2017-04-13 08:54:46
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);你可以试试这个。
https://stackoverflow.com/questions/43387152
复制相似问题