Java регулярное выражение несколько совпадений - PullRequest
0 голосов
/ 15 мая 2018

У меня есть следующий фрагмент кода Java:

Pattern pattern = Pattern.compile("\\$\\{.+\\}");
String str = "str1/${com.test.p1}/str2/${com.test.p2}str3";
int start = 0;
Matcher m = pattern.matcher(str);
while (m.find(start)) {
    System.out.println(m.start());
    System.out.println(m.end());
    start = m.end();
}

Я пытаюсь извлечь строки в скобках (com.test.p1 & com.test.p2). Однако при выполнении кода вывод будет следующим:

5
47

, что означает, что шаблон соответствует всей последовательности:

${com.test.p1}/str2/${com.test.p2}

Скорее всего, это происходит потому, что регулярное выражение несколько жадное и потребляет все входные данные, пока не достигнет последней закрывающей скобки. Как я могу переписать шаблон так, чтобы он соответствовал всем этим регионам, при условии, что нет фиксированного числа?

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Замените первую строку кода следующим:

Pattern pattern = Pattern.compile("[a-z0-9]+\\.[a-z0-9]+\\.[a-z0-9]+");

Этот шаблон извлечет две строки com.test.p1 & com.test.p2. Исход кода тогда будет:

7
18
27
38

Для будущего тестирования регулярных выражений я рекомендую https://regexr.com/

0 голосов
/ 16 мая 2018

В ответ на вопрос анубхава вы должны сделать регулярное выражение ленивым

\$\{.+?\}

Вот рабочая версия регулярного выражения: regexr.com ,и, кстати, хорошее место, чтобы написать / проверить и понять регулярное выражение:)

...