Скажем, у нас есть String в Java, который содержит HTML-код.
Я хотел бы сделать что-то вроде возврата каждой подстроки внутри этой строки, содержащей " <li>stuff here</li>
". Я также понимаю, что у ведущего li-тега могут быть параметры. БОЛЬШАЯ проблема в том, что в одной строке может быть несколько пар <li></li>
, особенно если кто-то, кто пишет HTML, любит, чтобы все было сжато и менее читаемо для человека! ;)
Я немного подумал об использовании таких вещей, как string split, и проецировал массив строк программным путем, добавив логический флаг в true, когда im в <li>
, и false, когда я выхожу. Возможно, это сработает, но он чувствует себя очень не изящно.
Как я могу создать метод, который возвращает, например ArrayList <String>
всех результатов? Могу ли я сделать это без регулярного выражения? Я искал регулярное выражение и кажется мощным, но иногда синтаксис может быть очень сложным. Если мне придется прибегать к регулярному выражению, я буду, но более простые и понятные решения оценены!
Если нет регулярного выражения и нет четкого и понятного пути, я буду рассматривать шаблоны регулярных выражений.
Я думаю, что Regex не должен быть настолько сложным. То, что вы хотите сделать (если я правильно понимаю), фактически избавляется от всего, что выглядит как <li>
или даже любого другого html-тега, и просто остальное.
String test = "<li>stuff here</li>" ;
String[] split = test.split("(<.*?>)");
System.out.println(Arrays.toString(split));
если вы запустите этот код, он вернет вам это
[, stuff here]
Регулярное выражение: (
regex here )
→ фигурные скобки означают, что вы ищете что-то, что соответствует регулярному выражению в фигурных скобках. Как и всегда, вы можете использовать фигурные скобки для объединения большего количества регулярных выражений к большому регулярному выражению... любым способом:
<.*?>
< означает: "Я хочу что-то, начинающееся с <
, означает "после моего < может быть что угодно: письмо, число, какой-то особый знак... просто что-нибудь" *
означает, что может быть столько букв или цифр или специальных знаков, как хотят быть "
? означает: "Я даже принимаю это, когда нет ничего (после <)" EDIT: по крайней мере до следующего "матча".. (см. комментарий CAustin - спасибо!)
> означает: хорошо, что когда-либо я нахожу между моим первым < и этим > сейчас, мне все равно, я просто нашел свое регулярное выражение "
Итак, вы можете найти что угодно, например:
<li>
</li>
<title>
<div id="todeloot">
</tr>
Все с < в начале и в > в конце будет соответствовать вашему регулярному выражению.
Теперь метод split
вырезает вашу html-String во многие маленькие строки и помещает их в массив. Но он оставит все, что вы найдете в регулярном выражении. это означает, что <title>
или <li>
просто проглотит.
Пример:
<html><body><H1>hello world</h1><li>list item 1</li><li>list item 2</li> well that was my list.</body></html>
приведет к:
[, , , hello world, , list item 1, , list item 2, well that was my list.]
да и пустые строки в начале или в середине появятся, когда нет текста между двумя html-тегами.
Другой пример
"(<li.*?>)"
- вырезает строку прямо в каждом элементе <li>
(с дополнительными html-параметрами, такими как id или name, или без них "(<.?li.*?>)"
- будет соответствовать каждой строке, которая выглядит как <li>
или </li>
(также с дополнительными параметрами или без них)
?
после *
или +
не делает сопоставление необязательным - это делает его нежадным, то есть *
прекращает сопоставление, как только регулярное выражение может соответствовать следующему шагу шаблона (и все равно разрешает все совпадение, когда оно выполнено) ).