Вы можете использовать
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