2009-02-04 2 views
1

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

Но я хочу обнаружить тег '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

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

"<select[^>]*>(.+?)</select\s*>" 
+0

Эй, я пробовал ваше регулярное выражение, оно работает для тегов в одной строке, но не несколько. Проверьте здесь - http://regexr.com/38udu Можете ли вы помочь, что изменить, чтобы выбрать тег по нескольким строкам. –

+1

@NitishDhar '.' не соответствует разрыву строк; попробуйте '[^]' или '[\ s \ S]' вместо этого. – Gumbo

+0

Спасибо, тонна, он работал с обоими. –

1

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

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

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

Это, как говорится, я действительно хотел бы получить DOM и использовать XPath (или подобное) для выполнения ваших запросов, поскольку регулярные выражения не являются well known for their ability to deal with trees.

+0

Оставьте выключение «>» от открытия тега Случай есть атрибуты. Я не думаю, что есть причина оставить его с закрывающим тегом. –

+0

Это не соответствует любым

0

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

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

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

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

0

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

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

Важная роль здесь «((? :(?! выбрать).) *)», Который принимает все, что не конфликтует с отрицательным прогнозным.

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

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

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

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

Без прогностическим или ленивый квантор следующий будет проблемой вместо:

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

 Смежные вопросы

  • Нет связанных вопросов^_^