Нужна помощь о том, как сделать регулярное выражение и почему это не работает - PullRequest
0 голосов
/ 06 ноября 2019

Это текст:

<div class="center-content">  <h2> <a href="https://lapiedradesisifo.com/2019/11/04/la-silenciosa-linea-del-idioma-no-hablado/" class="l:3207185" > La silenciosa línea del idioma no hablado </a>

Мой код:

Pattern p = Pattern.compile("<div class=\"center-content\"> *<h2> <a.{10,200} >(.{50,200})</a>");
Matcher m = p.matcher(text);

StringBuilder sb = new StringBuilder();
while(m.find()){
    sb.append(m.group(1) + "\n");
}

System.out.println(sb.toString());

Это то, что я ожидал напечатать на экране:

"La silenciosa línea del idioma no hablado"

Но ничегопечатается, я действительно не знаю почему, потому что я попробовал это с подобными примерами, и это работает.

Я должен быть честным, я получил это регулярное выражение с некоторой помощью, и я все еще не очень понимаюкак это работает, буду очень признателен за помощь.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

Как указал Майк в комментарии, используйте правильный анализатор HTML для обработки ввода HTML. Однако, если вам интересно, как работает ваше регулярное выражение, я постараюсь кратко описать его.

Текущий шаблон

Ваш текущий шаблон работает следующим образом

<div class=\"center-content\">- соответствует буквально <div class="center-content">

*<h2> - соответствует любому символу от нуля до неограниченного времени, за которым следует <h2>

<a.{10,200} > - соответствует <a, за которым следует любой символ между 10и 200 раз, за ​​которыми следует символ >

(.{50,200}) - этот соответствует любому персонажу от 50 до 200 раз и захватывает его в группу. Это, кстати, то, что вы получаете в своем коде по телефону m.group(1)

</a> - соответствует </a> буквально

Упрощенная версия

Однако, еслиВаша цель - просто захватить текст, заключенный в элемент a, вы можете упростить свое регулярное выражение до <a\s+href=.*?>(.*?)</a>, которое работает следующим образом:

<a\s+href= - соответствует <a href=

.*?> - соответствует части URL элемента a (любой символ от 0 до неограниченного числа раз, как можно меньше), за которым следует >

(.*?) - захватывает что-либо вмежду > и < (как можно меньше раз) - позвоните .group(1), чтобы получить

</a> - соответствует </a>

0 голосов
/ 06 ноября 2019

"."не соответствует переводу строк по умолчанию. HTML, который вы хотите проанализировать, кажется, содержит новые строки.

Вы можете использовать Pattern.compile("pattern",Pattern.DOTALL), чтобы сделать "."совпадать с новыми строками тоже. Даже с этим, ваше регулярное выражение не будет соответствовать. Вы можете использовать некоторый онлайн-тестер, чтобы выяснить, что не так («La silenciosa línea del idioma no hablado» составляет <50 символов, новая строка в «center-content») </p>

https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#DOTALL https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#compile(java.lang.String,%20int)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...