Если внутренний текст внутри ${...;...}
не может содержать {
, }
и ;
, используйте решение класса символов с отрицанием:
\$\{([^;{}]*);\s*([^{};]*)}
См. Демонстрационную версию regex .
Если план должен соответствовать только символам слова, вы можете упростить его до
\$\{(\w+)\s*;\s*(\w+)}
См. еще одну демонстрацию регулярных выражений .
Подробности
\$\{
- подстрока ${
([^;{}]*)
- Группа 1: любые 0+ символов, кроме ;
, {
и}
((\w+)
будет соответствовать 1 или более слов, букв, цифр, подчеркиваний) \s*;\s*
- ;
, заключенный в 0+ пробелов ([^;{}]*)
-Группа 2: любые 0+ символов, кроме ;
, {
и }
}
- }
char.
Java-демонстрация:
String s = "Test 123 ${tag1} lorem ipsum ${tag2} ${tag3; tag4} ${tag5; tag6} dixit lorem ${tag7} dixit lorem ${tag8}.";
Pattern pattern = Pattern.compile("\\$\\{(\\w+)\\s*;\\s*(\\w+)}");
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
System.out.println(matcher.group());
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
System.out.println("=== END OF MATCH ===");
}
Выход:
${tag3; tag4}
tag3
tag4
=== END OF MATCH ===
${tag5; tag6}
tag5
tag6
=== END OF MATCH ===