我正在尝试用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>
答案 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?", "");
答案 2 :(得分:0)
我认为你的陈述是
str.replaceAll(".*<select.*", "");
不是
str.replaceAll(".*<start.*", "");
您需要忽略<select
这样的东西会获取标签名称(<
(?<=\<)start(?=(.*))
或者您可以使用
抓取<start
(?<=.)\<start(?=(.*))