Помогите составить регулярное выражение Java regex
Помогите плиз составить регулярное выражение
<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 привести к такому виду
Ответы (2 шт):
Можно написать регулярное выражение вот так:
<option(?!\sdisabled).*?>(.*?)</option>
Здесь ищем группы (.*?) между тегами <option></option>, при этом в самом теге могут быть какие угодно атрибуты .*?, но не должно быть disabled (?!\sdisabled).
Код на java:
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, в качестве разделителя также добавляем "|".
Как группы заканчиваются, убираем разделитель в конце результирующей строковой переменной.
Вариант регулярки, в которой проверяется наличие непустого атрибута 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