Regex для сопоставления всех вхождений в пределах 2 строк + Java - PullRequest
0 голосов
/ 25 января 2019

Мне нужно сопоставить и заменить обратную косую черту \ на прямую косую черту / между двумя конкретными словами, используя Java.Я попробовал это, и он прекрасно работает в тестере регулярных выражений https://regexr.com/474s0, но не работает, когда я тестирую из приложения на основе Java;получение этой ошибки.

org.apache.oro.text.regex.MalformedPatternException: последовательность (? <...) не распознана </p>

Регулярное выражение попыталось: (?<=<(DocumentImagePath)>.*?)(\\)(?=.*<\/(DocumentImagePath)>)

Образец:

<DocumentImagePath>95230-88\M0010002F.tif\test</DocumentImagePath> <DocumentImagePath>123-88\M0010002F.tif\test</DocumentImagePath> <DocumentImagePath>abc-88\M0010002F.tif\test</DocumentImagePath>

Любая помощь приветствуется.

Примечание: я понимаю, что положительный взгляд не являетсяподдерживается во всех компиляторах, но ищет подходящее регулярное выражение для замены, которое работает на Java.

1 Ответ

0 голосов
/ 25 января 2019

Вы можете сделать это так (Java 9 +):

String sample = "<DocumentImagePath>95230-88\\M0010002F.tif\\test</DocumentImagePath>\r\n" +
                "95230-88\\M0010002F.tif\\test\r\n" +
                "<DocumentImagePath>123-88\\M0010002F.tif\\test</DocumentImagePath>\r\n" +
                "<DocumentImagePath>abc-88\\M0010002F.tif\\test</DocumentImagePath>\r\n";

String result = Pattern.compile("<DocumentImagePath>.*?</DocumentImagePath>")
                       .matcher(sample)
                       .replaceAll(r -> r.group().replace('\\', '/'));

System.out.println(result);

выход

<DocumentImagePath>95230-88/M0010002F.tif/test</DocumentImagePath>
95230-88\M0010002F.tif\test
<DocumentImagePath>123-88/M0010002F.tif/test</DocumentImagePath>
<DocumentImagePath>abc-88/M0010002F.tif/test</DocumentImagePath>

ОБНОВЛЕНИЕ: Для Java 8 и более ранних версий используйте этот код:

StringBuffer buf = new StringBuffer();
Matcher m = Pattern.compile("<DocumentImagePath>.*?</DocumentImagePath>").matcher(sample);
while (m.find())
    m.appendReplacement(buf, m.group().replace('\\', '/'));
String result = m.appendTail(buf).toString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...