Regex в Java, поиск начала и конца тега - PullRequest
1 голос
/ 04 февраля 2009

Я пытаюсь найти данные в документе HTML. Мне не нужен полноценный парсер, так как это просто данные между одним тегом.

Но я хочу обнаружить тег 'select' и данные между ними.

return Pattern.compile(pattern, 
                       Pattern.CASE_INSENSITIVE | Pattern.MULTILINE |
                       Pattern.DOTALL);

/// End right angle bracket left off intentionally:
track_pattern_buf.append("<select");
track_pattern_buf.append("(.*?)");
track_pattern_buf.append("</select");

Это «регулярное выражение», которое вы бы использовали?

Ответы [ 5 ]

5 голосов
/ 04 февраля 2009

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

"<select[^>]*>(.+?)</select\s*>"
1 голос
/ 04 февраля 2009

Я бы использовал что-то похожее на:

"<select>([^<>]+)</select>"

Я не уверен, почему вы пропустили '>, и я не хотел бы сопоставлять другие теги (здесь я предполагаю, что мы ищем текстовые данные, а не фрагмент документа).

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

0 голосов
/ 03 сентября 2013

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

"(?<selectGroupName><select>((?:(?!select).)*)</select>)"

Важной частью здесь является "((? :( ?! select).) *)", Которая принимает все, что не противоречит отрицательному прогнозу.

То же самое можно сделать с помощью ленивого квантификатора:

"(?<selectGroupName><select>(.*?)</select>)"

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

<select>
    <select>
    </select>
</select>

Без заглядывания в будущее или ленивого квантификатора вместо этого возникнет проблема:

<select>
</select>
<a>
    <select>
    </select>
</a>
0 голосов
/ 07 августа 2012

Я понимаю, что вы не думаете, что вам нужен полноценный парсер - мы все в какой-то момент написали парсер HTML-регулярных выражений, думая: "Мой вариант использования очень прост, конечно, я могу использовать регулярное выражение это раз! "

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

Проверьте jSoup - это просто, быстро и работает. Там действительно нет веских причин, чтобы не использовать его.

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

0 голосов
/ 04 февраля 2009

Я думаю, что безопаснее было бы иметь что-то вроде:

"<\s*select\s*>(.*?)<\s*/select\s*>"

Для большей безопасности вам, вероятно, следует добавить \ w * после первого выбора, если появятся какие-либо другие параметры выбора.

Также 3-й \ s * может быть пропущен, если ваш HTML соответствует стандарту.

...