如何从与Java中特定表达式匹配的字符串中获取值?

如何从与Java中特定表达式匹配的字符串中获取值?,java,regex,templates,matcher,Java,Regex,Templates,Matcher,我在做一个表达式值读取器。在到处寻找类似这样的API,但没有找到任何东西之后,我决定创建自己的API。我创建了一个名为ExpressionMatcher的类。这就是它的工作原理: private static final String TEMPLATE = "my name is {username} and i am {userage} years old"; private ExpressionMatcher expressionMatcher = new ExpressionMat

我在做一个表达式值读取器。在到处寻找类似这样的API,但没有找到任何东西之后,我决定创建自己的API。我创建了一个名为ExpressionMatcher的类。这就是它的工作原理:

    private static final String TEMPLATE = "my name is {username} and i am {userage} years old";
private ExpressionMatcher expressionMatcher = new ExpressionMatcher(TEMPLATE);
  ...
  String matias = "my name is Matias and i am 25 years old";
  String fede = "my name is Federico and i am 23 years old";

    Map<String, String> variables = expressionMatcher.getValuesFromString(matias);

    assertEquals("Matias", variables.get("username"));
private static final String TEMPLATE=“我的名字是{username},我是{userage}岁”;
私有ExpressionMatcher ExpressionMatcher=新ExpressionMatcher(模板);
...
String matias=“我叫matias,今年25岁”;
String fede=“我叫费德里科,今年23岁”;
Map variables=expressionMatcher.getValuesFromString(matias);
assertEquals(“Matias”,variables.get(“用户名”);
表达式匹配器的代码如下:

public class ExpressionMatcher {

List<String> variableNames = new ArrayList<String>();
private final Pattern expressionPattern;

public ExpressionMatcher(String template) {
    // Look for variable names in the string
    Pattern pattern = Pattern.compile("\\{(.*?)\\}");
    Matcher matcher = pattern.matcher(template);
    while(matcher.find()) {
        // Add variable names into a list
        variableNames.add(matcher.group(1));
    }
    // replace the variable names with a new regex that will match all incoming expressions and compile a pattern
    this.expressionPattern = Pattern.compile(matcher.replaceAll("(.*?)"));

}

public Map<String, String> getValuesFromString(String expression) {
    Matcher matcher = this.expressionPattern.matcher(expression);
    Map<String, String> variables = new HashMap<String, String>();
    if(!matcher.matches()) {
        return Collections.emptyMap();
    } else {
        int i = 0;
        while(matcher.find()) {

            variables.put(variables.get(i), matcher.group(1));
            i++;
        }
    }
    return variables;
}
公共类表达式匹配器{
List variableNames=new ArrayList();
私人最终模式表达模式;
公共表达式匹配器(字符串模板){
//在字符串中查找变量名
Pattern=Pattern.compile(“\\{(.*?\\}”);
Matcher Matcher=pattern.Matcher(模板);
while(matcher.find()){
//将变量名添加到列表中
variableNames.add(matcher.group(1));
}
//用新的正则表达式替换变量名,该正则表达式将匹配所有传入表达式并编译模式
this.expressionPattern=Pattern.compile(matcher.replaceAll((.*));
}
公共映射getValuesFromString(字符串表达式){
Matcher Matcher=this.expressionPattern.Matcher(表达式);
Map variables=newhashmap();
如果(!matcher.matches()){
return Collections.emptyMap();
}否则{
int i=0;
while(matcher.find()){
variables.put(variables.get(i),matcher.group(1));
i++;
}
}
返回变量;
}
到目前为止,我已经成功地获得了变量名,但我无法获得纯文本表达式的值。我如何才能做到这一点? 谢谢,

别客气

在进一步测试之后,我修复了这个问题。在getValueFromString方法中,我添加了以下代码:

    public Map<String, String> getValuesFromExpression(String expression) {
    Matcher matcher = this.expressionPattern.matcher(expression);
    Map<String, String> variables = new HashMap<String, String>();
    if(!matcher.matches()) {
        return Collections.emptyMap();
    } else {
        // Iterate over the groups
        for(int i = 0; i < matcher.groupCount(); i++) {
            variables.put(variableNames.get(i), matcher.group(i + 1));
        }
    }
    return variables;
}
publicmap getValuesFromExpression(字符串表达式){
Matcher Matcher=this.expressionPattern.Matcher(表达式);
Map variables=newhashmap();
如果(!matcher.matches()){
return Collections.emptyMap();
}否则{
//迭代组
对于(int i=0;i

我希望这至少对某人有所帮助。

请使用下面的代码来执行它

public static void main(String[] args) {
    String template = "Hello {user} request id is {id}. {name} ";
    String testString = "Hello ABC , your  request id is 1234.  Ihab ";
    getPlaceholderValues(template, testString);
}

public static Map<String , String> getPlaceholderValues(String template , String testString){
    List<String> list = getPatternKeys(template);

    String  patternFromTemplate = template.replaceAll("\\.", "\\\\."); 

    for (String item : list){
        patternFromTemplate = patternFromTemplate.replace("{"+item+"}", "(.*)");
    };

    Map<String , String> map = new HashMap<String , String>();

    Pattern p = Pattern.compile(patternFromTemplate);
    Matcher m = p.matcher(testString);
    if (m.matches()) {
        for (String item : list){
            System.out.println(item +" = "+m.group(list.indexOf(item)+1));
            map.put(item, m.group(list.indexOf(item)+1));
        }
    }
    return map;
}

public static List<String> getPatternKeys(String template){
    List<String> list = new ArrayList<String>();
    Pattern pattern = Pattern.compile("\\{(.*?)\\}");
    Matcher matcher = pattern.matcher(template);

    while(matcher.find()) {
         list.add(matcher.group(1));
    }
    return list;
}
publicstaticvoidmain(字符串[]args){
String template=“Hello{user}请求id为{id}.{name}”;
String testString=“你好,ABC,您的请求id是1234.Ihab”;
GetPlaceholder值(模板、测试字符串);
}
公共静态映射GetPlaceholder值(字符串模板、字符串测试字符串){
列表=getPatternKeys(模板);
String patternFromTemplate=template.replaceAll(“\\.”,“\\\\\\.”);
用于(字符串项:列表){
patternFromTemplate=patternFromTemplate.replace(“{”+项+“}”,“(.*)”);
};
Map Map=newhashmap();
Pattern p=Pattern.compile(patternFromTemplate);
Matcher m=p.Matcher(testString);
如果(m.matches()){
用于(字符串项:列表){
System.out.println(item+“=”+m.group(list.indexOf(item)+1));
map.put(item,m.group(list.indexOf(item)+1));
}
}
返回图;
}
公共静态列表getPatternKeys(字符串模板){
列表=新的ArrayList();
Pattern=Pattern.compile(“\\{(.*?\\}”);
Matcher Matcher=pattern.Matcher(模板);
while(matcher.find()){
添加(匹配器组(1));
}
退货清单;
}

看起来像邮件合并。
String inputStr1 = "Welcome to dataqlo. This is John Doe.";

String template1 = "Welcome to $company. This is $host.";

System.out.println(tpObj.parse(inputStr1,template1));

//Result {host=John Doe, company=dataqlo}