Как заменить содержимое группы регулярным выражением - PullRequest
1 голос
/ 15 марта 2019

Это исходная строка:

233<C:\Users\Grapes\Documents\title.png>233<C:\Users\Grapes\Documents\title.png>33

Это замененная строка, которую я хочу: 233<1>233<2>33

Я хочу заменить путь к файлу встрока с идентификатором, который я получил после загрузки на сервер, но моя программа находится в бесконечном цикле.

public void sendMessage(String msg) {
    new Thread(()-> {
        var pat = Pattern.compile("<(.*?[^\\\\])>");
        var matcher = pat.matcher(msg);
        int k = 0;
        while (matcher.find()) {
            matcher.replaceFirst("<" + k++ + ">"));
        }
        System.out.println(msg);
    }).start();
}

1 Ответ

5 голосов
/ 15 марта 2019

Вы можете использовать Matcher#appendReplacement:

String s = "233<C:\\Users\\Grapes\\Documents\\title.png>233<C:\\Users\\Grapes\\Documents\\title.png>33";
int k = 0;
StringBuffer result = new StringBuffer();
Matcher m = Pattern.compile("<[^<>]*>").matcher(s);
while (m.find()) {
    m.appendReplacement(result, "<" + ++k + ">");
}
m.appendTail(result);
System.out.println(result.toString());
// => 233<1>233<2>33

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

В вашем случае достаточно шаблона <[^<>]*>, так как он будет соответствовать <, затем любым 0 или более символам, отличным от < и >, а затем <.

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