Помогите составить регулярное выражение Java regex

Рейтинг: -1Ответов: 2Опубликовано: 19.05.2023

Помогите плиз составить регулярное выражение

<option disabled="" value="">---</option><option value="2089974">Shimano/SRAM HG 10/11-speed</option><option value="2089975">SRAM XDR 11/12s</option>

мне нужно собрать значения опций и разделить их символом (разделитель например | или другим)

Shimano/SRAM HG 10/11-speed|SRAM XDR 11/12s привести к такому виду

Ответы

▲ 0

Можно написать регулярное выражение вот так:
<option(?!\sdisabled).*?>(.*?)</option>

Здесь ищем группы (.*?) между тегами <option></option>, при этом в самом теге могут быть какие угодно атрибуты .*?, но не должно быть disabled (?!\sdisabled).

Код на :

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MyClass {
    public static void main(String args[]) {
      String s = "<option disabled=\"\" value=\"\">---</option><option value=\"2089974\">Shimano/SRAM HG 10/11-speed</option><option value=\"2089975\">SRAM XDR 11/12s</option>";
      String regex = "<option(?!\sdisabled).*?>(.*?)</option>";
      String result = "";
      
      Pattern p = Pattern.compile(regex);
      Matcher m = p.matcher(s);
      
      while (m.find()) {
          result += m.group(1) + "|";
      }
      result = result.replaceAll(".$", "");
      System.out.println(result);
    }
}
Вывод:
Shimano/SRAM HG 10/11-speed|SRAM XDR 11/12s

В while (m.find()) забираем все группы и добавляем в result, в качестве разделителя также добавляем "|".
Как группы заканчиваются, убираем разделитель в конце результирующей строковой переменной.

▲ 0

Вариант регулярки, в которой проверяется наличие непустого атрибута value в теге option и непустое содержимое самого тега: <option value=\"\\d+\">([^<]+)</option>.

Также можно использовать Stream API (Java 9+) для получения потока нужных совпадений и конкатенации в одну строку с разделителем "|":

public static String getOptions(String str) {
    return Pattern.compile("<option value=\"\\d+\">([^<]+)</option>", Pattern.CASE_INSENSITIVE)
        .matcher(str)
        .results() // Stream<MatchResult>
        .map(mr -> mr.group(1)) // группа 1 содержит текст внутри тега
        .collect(Collectors.joining("|"));
}

Тест:

System.out.println(getOptions(
"<option disabled=\"\" value=\"\">---</option><OPTION value=\"2089974\">Shimano/SRAM HG 10/11-speed</option><option value=\"2089975\">SRAM XDR 11/12s</option>"
));
Shimano/SRAM HG 10/11-speed|SRAM XDR 11/12s