2014-03-06 4 views
0

Я пытаюсь написать регулярное выражение в Java, чтобы удалить все из начала <select>, и конец тега select </>, как показано ниже. Я написал регулярное выражение, чтобы удалить все, начиная с <start> тега с пустым, как показано ниже. Проблема в том, что он удаляет все, как ожидалось, за исключением четвертой строки, <select name="first" ... the popular. Он удаляет все в этой строке и игнорирует содержимое, которое находится в следующей строке, and ... president"/>. Я хочу включить все, начиная с начала и конца тега. Как я могу это сделать?Регулярное выражение для удаления определенных HTML-тегов

str.replaceAll(".*<start.*", ""); 

Фактическая ул Строка имеет содержание показано ниже:

<select name="id" content="2454803.html"/> 
<select name="nameid" content="2454803"/> 
<select name="type" content="prd"/> 
<select name="first" content="In 2004, Charlie, the popular 
and charismatic senator , became the first president"/> 
<select name="title" content="Charlie"/> 
<h1> 
<!--toc:insert content="checkbox" id="_1_0"/>--> 
</h1> 
<p class="tocline"><a href="2454803">Table of Contents</a></p> 
+0

Вы должны использовать HTML-парсер, чтобы сделать что-то материал – fge

+0

должен быть фильтр, который просто перенаправляет вас на [почему это не сработает] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454 # 1732454), когда вы помещаете 'regex' и' html/xml' в заголовок! Это и нам нужно «закрыть», потому что речь идет о разборе html с регулярными выражениями »* –

+0

@fge это не html как таковой. Я обрабатываю весь этот html как одно содержимое строки. – user3161879

ответ

2

Как уже упоминалось комментарии, вы действительно не должны использовать регулярное выражение для этого. Однако проблема заключается в том, что символ точки в регулярном выражении по умолчанию не соответствует символам новой строки. Вы должны включить (? S) в начало регулярного выражения, чтобы сделать это. Итак:

str.replaceAll("(?s)<select.*?/>", ""); 
+0

Uhm, это в значительной степени заменит _every input_, где есть ' fge

+0

Хм, не смотрел на это очень близко. Я просто бросил на точку совпадения newline, предполагая, что его регулярное выражение также было правильным. Исправлена. – kabb

+0

Во-первых, '*' нужно сделать не-жадным с '?', Иначе он начнет сопоставлять ' '. Это не проблема в примере в вопросе, но это будет проблемой в любом коде, который имеет '/>' в какой-то более поздний момент. Во-вторых, немного проще просто использовать набор классов символов вместе со своим отрицательным классом, чтобы соответствовать символам '.' и новой строки вместо добавления модификаторов в начало выражения. Вот что я сделал бы: '. *