用于删除特定HTML标记的正则表达式

时间:2014-03-06 21:44:47

标签: java regex

我正在尝试用Java编写正则表达式,以从<select>的开头和select </>标记的结尾删除所有内容,如下所示。我写了一个正则表达式来删除从<start>标签开始的所有内容,如下所示。问题是除了第四行<select name="first" ... the popular之外,它正在按预期删除所有内容。它会删除该行中的所有内容,并忽略下一行and ... president"/>中的内容。我想要包括从开始和结束标记的所有内容。我怎么能这样做?

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

实际的String str的内容如下所示:

<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>

3 个答案:

答案 0 :(得分:2)

正如所提到的评论,你真的不应该使用正则表达式。但是,问题是默认情况下正则表达式中的点字符与换行符不匹配。你必须在正则表达式的开头加入(?s)来实现它。所以:

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

答案 1 :(得分:2)

根据Java文档,Pattern.html#lt

  

正则表达式.匹配除行终止符之外的任何字符,除非指定了DOTALL标志。

行终止符含义:

  
      
  • 换行符(换行符)('\n'),
  •   
  • 回车符后面紧跟换行符("\r\n"),
  •   
  • 一个独立的回车符('\r'),
  •   
  • 下一行字符('\u0085'),
  •   
  • 行分隔符('\u2028')或
  •   
  • 段落分隔符('\u2029)。
  •   

指定DOTALL标志的最简单方法是将(?s)添加到正则表达式的开头。还需要进行一些更改以适应此标志,因此最终正则表达式将为(?s)<select.*?>\r?\n?,应用为

str.replaceAll("(?s)<select.*?>\\r?\\n?", "");

此处示范:http://regex101.com/r/bW8aR7

或者,您可以使用正则表达式<select[^>]*>\r?\n?,如下所示:

str.replaceAll("<select[^>]*>\\r?\\n?", "");

此处示范:http://regex101.com/r/lO6mQ6

答案 2 :(得分:0)

我认为你的陈述是

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

不是

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

您需要忽略<select

之前和之后的所有内容

这样的东西会获取标签名称(<

之后的任何内容
(?<=\<)start(?=(.*))

或者您可以使用

抓取<start
(?<=.)\<start(?=(.*))