匹配器,用值查找和替换占位符
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
在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] }
我有一个输入字符串,类似于带有占位符的查询,像这样
#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
在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] }