-1

Помогите, пожалуйста, не могу найти слова в строке с помощью регулярки. Пробовала вот так:

Pattern d = Pattern.compile("(?<=(<th class=\"plainlist\")(.>)) 
([\\s\\S]*)(?=<\\/th>)");

Строка вот такая:

<th class="plainlist" style="min-width:9em; background:#eaecf0; 
vertical-align:top; padding-left:.5em; padding-right:.5em;">Род 
деятельности</th><th class="plainlist" style="min-width:9em; 
background:#eaecf0; vertical-align:top; padding-left:.5em; padding- 
right:.5em;">Язык произведений</th> 
<td class="plainlist">
<span class="no-wikidata" data-wikidata-property- 
id="P1412">русский</span></td>
</tr>

Нужно, чтобы вывело просто два слова: род деятельности

Моя регулярка исключает теги, но не их внутренности в скобках. Помогите, пожалуйста, разобраться. Что я делаю не так? Нужно, чтобы регулярка находила только то, что в тегах th.

Kira
  • 109
  • 1
    (?<=>)[^<]+(?=<) – JavaJunior Dec 24 '18 at 12:26
  • В тексте помимо тега th, есть и другие теги. Наверное, я неправильно описала задачу, но нужно, чтобы нашел только то, что в тегах th и вычленил из них текст. Сейчас переделаю описание. – Kira Dec 24 '18 at 12:46
  • 1
    Тогда (?<=>)[^<]+(?=</th) (в приведенном примере будет 2 совпадения т.к. тега th 2) – JavaJunior Dec 24 '18 at 13:02
  • 1
    Регулярки не годятся для парсинга html. Используйте специальные библиотеки для этого. – ЮрийСПб Dec 24 '18 at 15:13
  • @ЮрийСПб, для dotnet нашёл ответ с рекомендациями, который можно использовать для закрытия подобных вопросов как дубликатов. а для java подобного ответа что-то не вижу. надо бы написать. ну или клич кинуть, ведь знатоков java более чем достаточно. – aleksandr barakin Dec 25 '18 at 05:34
  • @alexanderbarakin, ого, для .Net очень крутой ответ) Для Java да, я такого не видел... Сам бы написал, коли время бы было) Может вы на мете вопрос поднимите? Авось и найдутся желающие ответ хороший накатать как было, например, для json: https://ru.stackoverflow.com/a/745095/17609 – ЮрийСПб Dec 25 '18 at 11:58
  • @ЮрийСПб добрый день! Я бы с радостью, но задание было написать именно регулярку, к сожалению. – Kira Dec 25 '18 at 18:44
  • @JavaJunior добрый день! Спасибо большое за ответ, смогла на базе вашего решения придумать свою регулярку. Вы подсказали мне замечательную идею - ориентироваться по закрывающему тегу. Очень вас благодарю! – Kira Dec 25 '18 at 18:45

1 Answers1

1

Попробуйте следующее регулярное выражение:

'<th[^>]+\\>([^<]+)\\<\\/th>'

См. пример использования этого выражения.

Pattern p = Pattern.compile("<th[^>]+\\>([^<]+)\\<\\/th>");
Matcher m = p.matcher(html); // html - ваша html-строка

System.out.println(m.find() ? m.group(1) : "no match");