Regex для получения текста между двумя символами в Java - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть эта строка:

Test 123 ${tag1} lorem ipsum ${tag2} ${tag3; tag4} ${tag5; tag6} dixit lorem ${tag7} dixit lorem ${tag8}.

Я хотел бы иметь регулярное выражение для выделения только текста между $ {tag;тег}.

Я пытался с этим:

\$\{(.*?)(; )(.*?)}

, но не могу получить то, что я ожидаю.Кто-нибудь предлагает?Спасибо

1 Ответ

0 голосов
/ 20 февраля 2019

Если внутренний текст внутри ${...;...} не может содержать {, } и ;, используйте решение класса символов с отрицанием:

\$\{([^;{}]*);\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 ===
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...