Шаблон регулярного выражения, требуемый в java для сопоставления строки, начинается с '{{' и заканчивается "}}" - PullRequest
1 голос
/ 22 апреля 2020

Привет, мне нужно создать шаблон регулярного выражения, который будет выбирать совпадающую строку, начинающуюся с '{{' и заканчивающуюся "}}" из данной строки.

The pattern I have created is working same with the strings starting with '{{{' and '{{', Similarly with ending with '}}}' and

'} } '

Output of above code:
matches = {{phone2}}
matches = {{phone3}}
matches = {{phone5}}


**Expected Output**:
matches = {{phone5}}

I need only Strings which follows two consecutive pattern of '{' and '}' not three.

Совместное использование кода ниже


    package com.test;

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;

    public class RegexTest {

    public static void main(String[] args) {

        String text = "<test>{{#phone1}}<a href=\"tel:{{{phone2}}}\">{{{phone3}}}</a>{{/phone4}} {{phone5}}></test>";

        //String pattern = "\\{\\{\\s*?(\\w*?)\\s*?(?!.*\\}\\}\\}$)";
        String pattern = "\\{\\{\\s*?(\\w*?)\\s*?}}";
            Pattern placeholderPattern = Pattern.compile(pattern);
            Matcher placeholderMatcher = placeholderPattern.matcher(text);
            while (placeholderMatcher.find()) {
                System.out.println("matches = " + placeholderMatcher.group());
            }

        }
    }

1 Ответ

1 голос
/ 22 апреля 2020

Вы можете использовать

String pattern = "(?<!\\{)\\{{2}\\s*(\\w*)\\s*\\}{2}(?!\\})";

Или, если пустое или пустое {{...}} не ожидается, используйте

String pattern = "(?<!\\{)\\{{2}\\s*(\\w+)\\s*\\}{2}(?!\\})";

См. Демонстрационную версию regex .

Подробности

  • (?<!\{) - отрицательный взгляд позади, если не найдено совпадение, если слева от текущего местоположения есть { символ
  • \{{2} - {{ подстрока
  • \s* - 0+ пробелов
  • (\w*) - Группа 1: один или несколько символов слова (1 или более, если + используется квантификатор)
  • \s* - 0+ пробелов
  • \}{2} - }} string
  • (?!\}) - отрицательный прогноз, который не дает совпадения, если есть } символ непосредственно справа от текущего местоположения.

См. Java демо :

String text = "<test>{{#phone1}}<a href=\"tel:{{{phone2}}}\">{{{phone3}}}</a>{{/phone4}} {{phone5}}></test>";
String pattern = "(?<!\\{)\\{{2}\\s*(\\w*)\\s*\\}{2}(?!\\})";
Pattern placeholderPattern = Pattern.compile(pattern);
Matcher placeholderMatcher = placeholderPattern.matcher(text);
while (placeholderMatcher.find()) {
    System.out.println("Match: " + placeholderMatcher.group());
    System.out.println("Group 1: " + placeholderMatcher.group(1));
}

Выход:

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