将String与值的值与带占位符的String进行比较,以查找其中的值

时间:2014-06-28 09:52:34

标签: java

我有以下模板

Hello {user}, your  request id is {id}, -------1

我的文字中填充了值,如

Hello ABC , your  request id is 1234.  --------2 

现在输入我的程序是2,我想检索像

这样的值
 {user} = ABC
 {id}   = 1234

您能否就上述问题向我提出任何解决方案。提前谢谢。

我想检索模板中占位符的值。输入是带有值的字符串,我必须将Template与该字符串匹配,以从该字符串中的模板中检索占位符的值。

2 个答案:

答案 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先出现,或iduser未出现在模板中),这将会中断。

它的作用:

  • 转义模板中的所有.个字符,这样就不会搞乱正则表达式
  • 将模板中的{user}替换为(.*)(捕获组1)
  • 将模板中的{id}替换为(.*)(捕获组2)
  • 将正则表达式应用于值为
  • 的字符串
  • 提取匹配项(如果正则表达式匹配)

与@ zx81建议的基本相同,唯一的区别是这里的正则表达式是基于模板动态创建的。