Чтобы вы ответили на свой вопрос с помощью регулярных выражений, я создал небольшой пример класса, который должен подсказывать вам направление, в котором вы могли бы пойти с этим (см. Ниже).
Проблема этого подхода заключается в том, что вы динамически создаете регулярное выражение, которое зависит от строк шаблона. Это означает, что вы должны каким-то образом убедиться, что ваши шаблоны не мешают компиляции регулярного выражения и самому процессу сопоставления.
Также atm, если вы будете использовать один и тот же заполнитель несколько раз в шаблоне, результирующий HashMap содержит только значение для последнего сопоставления заполнителя такого рода.
Обычно это ожидаемое поведение, но это зависит от вашей стратегии заполнения шаблонов.
Для обработки шаблонов в целом вы можете взглянуть на библиотеку усов.
Также, как упоминал Ули Соцчок, вам, вероятно, будет лучше использовать что-то вроде google-diff-match-patch .
public class StringExtractionFromTemplate {
public static void main(String[] args) {
String template = "/get/{id}/person";
String filledTemplate = "/get/1234ewq/person";
System.out.println(diffTemplateInsertion(template, filledTemplate).get("id"));
}
private static HashMap<String, String> diffTemplateInsertion(String template, String filledTemplate){
//language=RegExp
String placeHolderPattern = "\\{(.+)}";
HashMap<String, String> templateTranslation = new HashMap<>();
String regexedTemplate = template.replaceAll(placeHolderPattern, "(.+)");
Pattern pattern = Pattern.compile(regexedTemplate);
Matcher templateMatcher = pattern.matcher(template);
Matcher filledTemplateMatcher = pattern.matcher(filledTemplate);
while (templateMatcher.find() && filledTemplateMatcher.find()) {
if(templateMatcher.groupCount() == filledTemplateMatcher.groupCount()){
for (int i = 1; i <= templateMatcher.groupCount(); i++) {
templateTranslation.put(
templateMatcher.group(i).replaceAll(placeHolderPattern,"$1"),
filledTemplateMatcher.group(i)
);
}
}
}
return templateTranslation;
}
}