Как найти и получить несколько подстрок в строке в Java, и нужно ли регулярное выражение

0

Скажем, у нас есть String в Java, который содержит HTML-код.

Я хотел бы сделать что-то вроде возврата каждой подстроки внутри этой строки, содержащей " <li>stuff here</li> ". Я также понимаю, что у ведущего li-тега могут быть параметры. БОЛЬШАЯ проблема в том, что в одной строке может быть несколько пар <li></li>, особенно если кто-то, кто пишет HTML, любит, чтобы все было сжато и менее читаемо для человека! ;)

Я немного подумал об использовании таких вещей, как string split, и проецировал массив строк программным путем, добавив логический флаг в true, когда im в <li>, и false, когда я выхожу. Возможно, это сработает, но он чувствует себя очень не изящно.

Как я могу создать метод, который возвращает, например ArrayList <String> всех результатов? Могу ли я сделать это без регулярного выражения? Я искал регулярное выражение и кажется мощным, но иногда синтаксис может быть очень сложным. Если мне придется прибегать к регулярному выражению, я буду, но более простые и понятные решения оценены!

Если нет регулярного выражения и нет четкого и понятного пути, я буду рассматривать шаблоны регулярных выражений.

  • 2
    Вы {c, sh} могли бы использовать для этого HTML-парсер, такой как jsoup
  • 0
    См. Stackoverflow.com/questions/1732348/… (но на самом деле попробуйте анализатор HTML.)
Показать ещё 3 комментария
Теги:
string
substring

1 ответ

1

Я думаю, что 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> (также с дополнительными параметрами или без них)

  • 1
    Незначительная коррекция: ? после * или + не делает сопоставление необязательным - это делает его нежадным, то есть * прекращает сопоставление, как только регулярное выражение может соответствовать следующему шагу шаблона (и все равно разрешает все совпадение, когда оно выполнено) ).
  • 0
    Спасибо что подметил это. Остальное в порядке, как есть? Я не очень силен в Regex, мне просто нравится идея "разбирать это самостоятельно"
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню