ReplaceAll Regex: обновить группу перед заменой - PullRequest
0 голосов
/ 15 апреля 2020

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

String regex = "<button data-key=\"([^\"]*)([^<]*)</button>";

    while ((strLine = br.readLine()) != null) {
        String newStr = strLine.replaceAll(regex, "<button data-key=\"$1$2<span>&#x$1</span></button>");

    }

Это работает нормально, извлекая значение data-key (Group1 / $ 1) в тег span, когда значение простое (без «-» в нем), но когда ключом данных является, например, 1f1e8- 1f1e6 значение извлекается так: ?-1f1e6, поэтому я подумал, можно ли сделать что-то вроде этого:

String newStr = 
    strLine.replaceAll(regex, 
        "<button data-key=\"$1$2<span>&#x" + "$1".replaceAll("-", "&#x") + "</span></button>");

replace "-" -> "& # x" за $ 1 в replaceAll функция, но пока безуспешно, мне нужно перейти на Matchers? или любая помощь в лучшем подходе для этого сценария была бы признательна, спасибо.

Edit1:

CURRENT :

<button data-key="1f1e8-1f1e8-1f1e8"><span>&#x1f1e8-1f1e8-1f1e8</span></button><button data-key="1f1e8-1f1e9"><span>&#x1f1e8-1f1e9</span></button>

EXPECTED :

<button data-key="1f1e8-1f1e8-1f1e8"><span>&#x1f1e8&#x1f1e8&#x1f1e8</span></button><button data-key="1f1e8-1f1e9"><span>&#x1f1e8&#x1f1e9</span></button>

Редактировать2: ВХОД:

<button data-key="1f1e8-1f1e8-1f1e8"></button>
<button data-key="1f1e8-1f1e9"></button>

Редактировать3: ВСЕ ВХОД:

<div>
<h3>GG</h3>
 <div class="ep-categoryItems">
 <button class="ep-item" data-key="1f1e8-1f1e8-1f1e8" title="Grinning face" style="background-image: url('${cdn}/images/emoji/f1e8-1f1e8-1f1e8.png');"></button>
 <button class="ep-item" data-key="1f1e8-1f1e9" title="Grinning face" style="background-image: url('${cdn}/images/emoji/1f1e8-1f1e9.png');"></button>
 </div>
<div

1 Ответ

1 голос
/ 15 апреля 2020

ОБНОВЛЕНИЕ: Изменено для работы в Java 8 и с новым вводом.
Также исправлено добавление отсутствующих ;

Может сделать так:

String input = "<button data-key=\"1f1e8-1f1e8-1f1e8\"></button><button data-key=\"1f1e8-1f1e9\"> TO BE REPLACED </button>";

String regex = "(<button data-key=\"([^\"]+)\">).*?</button>";
StringBuffer buf = new StringBuffer();
Matcher m = Pattern.compile(regex).matcher(input);
while (m.find())
    m.appendReplacement(buf, m.group(1) + "<span>" + m.group(2).replaceAll("-?([0-9a-fA-F]+)", "&#x$1;") + "</span></button>");
String output = m.appendTail(buf).toString();

System.out.println(input);
System.out.println(output);

Вывод

<button data-key="1f1e8-1f1e8-1f1e8"></button><button data-key="1f1e8-1f1e9"> TO BE REPLACED </button>
<button data-key="1f1e8-1f1e8-1f1e8"><span>&#x1f1e8;&#x1f1e8;&#x1f1e8;</span></button><button data-key="1f1e8-1f1e9"><span>&#x1f1e8;&#x1f1e9;</span></button>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...