RegEx для извлечения нескольких тегов <div> - PullRequest
0 голосов
/ 16 июня 2011

Вот строка ввода:

<div class="matchthis">Orange</div>
<div class="dontmatch">One</div>
<div class="matchthis" id="hurdle">Lemon</div>
<div class="dontmatch">Two</div>
<div id="hurdle" class="matchthis">Peach</div>

Я хочу вывести ниже (все <div> теги, содержащие class="matchthis") :

<div class="matchthis">Orange</div>
<div class="matchthis" id="hurdle">Lemon</div>
<div id="hurdle" class="matchthis">Peach</div>

ThisJava RegEx <div class=\"matchthis\">(.*?)(?=</div>) будет выводить только следующее:

<div class="matchthis">Orange</div>

Пожалуйста, помогите улучшить RegEx, чтобы получить желаемый результат.

Пожалуйста, не говорите мне использовать более медленный DOM / Soup / и т.д.Интересно, может ли сырое регулярное выражение решить простую задачу, описанную выше (вы будете вознаграждены за ответ!).Да, я в курсе этого поста , так что даже не упоминай об этом.

Ответы [ 3 ]

3 голосов
/ 16 июня 2011

Если теги не могут быть вложенными, это возможно.

Вы можете добавить (?:\s+\w+=(?:"[^"]*"|'[^']*'|\S*))* к обеим сторонам вашего атрибута.

Не думайте, что это быстрее, чем хороший парсер.

2 голосов
/ 16 июня 2011
Pattern.compile(
   "<div class=\"matchthis\"(?:[^>\"']|\"[^\"]*\"|'[^']*')*>(.*?)(?=</div>)",
   Pattern.CASE_INSENSITIVE | Pattern.DOTALL)

Чтобы сломать это,

 (?:[^>\"']|\"[^\"]*\"|'[^']*')*

соответствует любому числу ниже из-за

 (?: ... )*

не-кавычек без тегов из-за

[^>\"']

или двойные кавычки

\"[^\"]*\"

или значения атрибутов в одинарных кавычках

'[^']*'

Pattern.DOTALL означает, что ваш .*? разрешит переводы строки в теле div.

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * "* будет".
0 голосов
/ 16 июня 2011

<div [^>]*class=\"matchthis\"[^>]*>(.*?)(?=</div>)

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