Java регулярное выражение: заменить $ {var} - PullRequest
4 голосов
/ 02 марта 2012

Я пытаюсь заменить строку вроде:

Hello, my name is ${name}. I am ${age} years old.

с

Hello, my name is Johannes. I am 22 years old.

Переменные хранятся в HashMap. Мой код пока:

private void replace() {
        HashMap<String, String> replacements = new HashMap<String, String>();
        replacements.put("name", "Johannes");
        replacements.put("age", "22");

        String text = "Hello, my name is {name}. I am {age} years old.";
        Pattern pattern = Pattern.compile("\\{(.+?)\\}");
        Matcher matcher = pattern.matcher(text);

        StringBuilder builder = new StringBuilder();
        int i = 0;
        while (matcher.find()) {
            String replacement = replacements.get(matcher.group(1));
            builder.append(text.substring(i, matcher.start()));
            if (replacement == null) {
                builder.append("");
            } else {
                builder.append(replacement);
                i = matcher.end();
            }
        }
        builder.append(text.substring(i, text.length()));
        System.out.println(builder);
    }

Это нормально, но я бы хотел заменить $ {var}, а не {var}. Измените его на Pattern.compile ("\ $ {(. +?) \}"); вызовет исключение PatternSyntaxException: "Illeagal повторение".

Выход из $ (Pattern.compile ("\\ $ {(. +?) \}") Приведет к ошибке компиляции.

Итак Как мне изменить свой Шаблон, чтобы он принимал $ {var} вместо {var}

Ответы [ 3 ]

3 голосов
/ 02 марта 2012

Символ {зарезервирован в большинстве библиотек регулярных выражений для повторения в соответствии с {n,m}.Попробуйте регулярное выражение

\\$\\{(.+?)\\}
2 голосов
/ 02 марта 2012

В ваших примерах замены вы забыли также избежать лидирующих {и $.

Так что вам нужно сделать:

Pattern.compile("\\$\\{(.+?)\\}"); 
2 голосов
/ 02 марта 2012

Попробуйте убрать фигурные скобки, чтобы избежать этой ошибки при неправильном повторении.

Как украдено из здесь : {и} являются особенными в диалекте регулярных выражений Java (и в большинстве других диалектов в этом отношении): они являются открывающими и закрывающими токенами для квантификатора повторения {n, m} где n и m являются целыми числами. Отсюда и сообщение об ошибке: «Недопустимое повторение».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...