如何从与Java中特定表达式匹配的字符串中获取值?
我在做一个表达式值读取器。在到处寻找类似这样的API,但没有找到任何东西之后,我决定创建自己的API。我创建了一个名为ExpressionMatcher的类。这就是它的工作原理:如何从与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
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}