Как извлечь строку из изменяющегося шаблона в Java? - PullRequest
1 голос
/ 06 марта 2019

У меня есть вопрос, касающийся лучших практик, касающихся регулярных выражений Java / манипулирования строками.

У меня есть изменяющийся шаблон String, скажем, на этот раз он выглядит так:

 /get/{id}/person

Iесть другая строка, которая соответствует этому шаблону, например.

/get/1234ewq/person

Имейте в виду, что шаблон может измениться в любое время, косые черты могут исчезнуть и т. д.

Я хотел бы извлечь разницу между двумяих, т. е. результатом обработки будет 1234ewq .Я знаю, что мог бы перебирать их символ за символом и сравнивать, но, если это возможно, я хотел найти какой-то разумный подход к нему с помощью регулярных выражений.

Какой будет наилучший подход Java?Спасибо.

1 Ответ

2 голосов
/ 07 марта 2019

Чтобы вы ответили на свой вопрос с помощью регулярных выражений, я создал небольшой пример класса, который должен подсказывать вам направление, в котором вы могли бы пойти с этим (см. Ниже).

Проблема этого подхода заключается в том, что вы динамически создаете регулярное выражение, которое зависит от строк шаблона. Это означает, что вы должны каким-то образом убедиться, что ваши шаблоны не мешают компиляции регулярного выражения и самому процессу сопоставления. Также 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...