我有以下模板
Hello {user}, your request id is {id}, -------1
我的文字中填充了值,如
Hello ABC , your request id is 1234. --------2
现在输入我的程序是2,我想检索像
这样的值 {user} = ABC
{id} = 1234
您能否就上述问题向我提出任何解决方案。提前谢谢。
我想检索模板中占位符的值。输入是带有值的字符串,我必须将Template与该字符串匹配,以从该字符串中的模板中检索占位符的值。
答案 0 :(得分:2)
使用此选项将字符串捕获到第1组和第2组,然后检索:
Hello ([^,]+), your request id is ([^.]+)
请参阅demo。
你的间距不一致所以我整理了它们,同时使用句点作为id
字段的分隔符,但它都可以调整。
示例代码
String userName = null;
String userID = null;
Pattern regex = Pattern.compile("Hello ([^,]+), your request id is ([^.]+)");
Matcher regexMatcher = regex.matcher(subjectString);
if (regexMatcher.find()) {
userName = regexMatcher.group(1);
userID = regexMatcher.group(2);
}
<强>解释强>
Hello
匹配Hello
和一个空格([^,]+)
中的括号将任何不是逗号的字符捕获到第1组, your request id is
匹配文字字符([^.]+)
将任何非句号的字符捕获到第1组。 这假设您的ID之后会有一段时间,如Hello ABC, your request id is 1234.
如果没有,我们会更改分隔符。
答案 1 :(得分:2)
如果要使用模板进行解析,可以执行以下操作:
public static void main(String[] args) {
String template = "Hello {user}, your request id is {id}.";
String withValues = "Hello ABC , your request id is 1234.";
String patternFromTemplate = template.replaceAll("\\.", "\\\\."); // escape "."
patternFromTemplate = patternFromTemplate.replace("{user}", "(.*)"); // capturing group 1
patternFromTemplate = patternFromTemplate.replace("{id}", "(.*)"); // capturing group 2
Pattern p = Pattern.compile(patternFromTemplate);
Matcher m = p.matcher(withValues);
if (m.matches()) {
System.out.println("{user} = "+m.group(1));
System.out.println("{id} = "+m.group(2));
}
}
但要小心模板中的字符(如.
),当字符串用作正则表达式时,这些字符具有特殊含义。请注意,如果您的模式发生重大变化(例如,如果id
先出现,或id
或user
未出现在模板中),这将会中断。
它的作用:
.
个字符,这样就不会搞乱正则表达式{user}
替换为(.*)
(捕获组1){id}
替换为(.*)
(捕获组2)与@ zx81建议的基本相同,唯一的区别是这里的正则表达式是基于模板动态创建的。