一个比较绕的正则问题
现在要清除 <!--demoStar--> XX文字 <!--demoEnd> 注释标签可以保留 可以不保留
之间的文字, 保留table 的标签等;
本人写了一天正则, 搞不出来, 求高手帮忙 !~ 谢谢
以下是demo
<table border="0" width="650"><tbody><tr><td valign="top" rowspan="2" width="383">
<!--demoStart-->
<br /><div class="jfitv_cons"><dl><dt>稳定高速的宽带网络,是您的必然之选!</dt><dd>天翼宽带,覆盖广,上网快,覆盖广东98%地区,最高速率可达100M,下载大片,5G的文件原来耗时1小时,现在只需10分钟!</dd><dt>7×24小时的服务团队,给您最到位的支持!</dt><dd>10000号服务热线7×24小时不间断的售前售后服务,同时为您提供网上营业厅、掌上营业厅、短信营业厅、自助服务终端等多种服务方式,给您带来最贴心到位的服务与支持。</dd><dt>完善的客服渠道,第一时间解除您的疑虑!</dt><dd>包括10000号客服中心、网上营业厅、掌上营业厅、QQ客服和实体营业厅的客户服务渠道体系,完善实施"一站式服务"。</dd><dt>专业的售后服务团队,免除您后顾之忧!</dt><dd>广东电信覆盖率高达98%,在全省21地市分设有办事机构,依托这些办事机构建立起了能第一时间响应客户需求的售后服务网络,秉承"用户至上,用心服务"的理念,为您彻底免除后顾之忧。</dd></dl></div><!--demoEnd--></td><td height="206" valign="top" width="250"><!--demoStart--><img style="margin: 0px; float: none" alt="一个比较绕的正则有关问题" src="http://172.18.8.6:8088/gdzhenqiEPG/userupload/null/20121109/20121109112640_J4Z_244x159.jpg" /><!--demoEnd--></td></tr><tr><td height="251" valign="top"> <!--demoStart--><br /><p class="hightlight">即日起至2012年12月31日,后付费融合套餐、单宽、e6用户均可使用9000积分换半年的高清宽带互联网视听(时尚包)。</p><br /><p class="hightlight">积分不够的用户还可以参加宽带互联网视听免费体验活动,预存宽带费用即可免费使用宽带互联网视听三个月!</p><!--demoEnd--></td></tr></tbody></table><p> </p><p> </p>
[最优解释]
不行喔!~
报错
Exception in thread "main" java.lang.StackOverflowError
at java.util.regex.Pattern$CharProperty.match(Pattern.java:3343)
[其他解释]
String str = "<table border='0' width='650'><tbody><tr><td valign='top' rowspan='2' width='383'><!--demoStart--><br /><div class='jfitv_cons'><dl><dt>稳定高速的宽带网络,是您的必然之选!</dt><dd>天翼宽带,覆盖广,上网快,覆盖广东98%地区,最高速率可达100M,下载大片,5G的文件原来耗时1小时,现在只需10分钟!</dd><dt>7×24小时的服务团队,给您最到位的支持!</dt><dd>10000号服务热线7×24小时不间断的售前售后服务,同时为您提供网上营业厅、掌上营业厅、短信营业厅、自助服务终端等多种服务方式,给您带来最贴心到位的服务与支持。</dd><dt>完善的客服渠道,第一时间解除您的疑虑!</dt><dd>包括10000号客服中心、网上营业厅、掌上营业厅、QQ客服和实体营业厅的客户服务渠道体系,完善实施'一站式服务'。</dd><dt>专业的售后服务团队,免除您后顾之忧!</dt><dd>广东电信覆盖率高达98%,在全省21地市分设有办事机构,依托这些办事机构建立起了能第一时间响应客户需求的售后服务网络,秉承'用户至上,用心服务'的理念,为您彻底免除后顾之忧。</dd></dl></div><!--demoEnd--></td><td height='206' valign='top' width='250'><!--demoStart--><img style='margin: 0px; float: none' alt='' src='http://172.18.8.6:8088/gdzhenqiEPG/userupload/null/20121109/20121109112640_J4Z_244x159.jpg' /><!--demoEnd--></td></tr><tr><td height='251' valign='top'> <!--demoStart--><br /><p class='hightlight'>即日起至2012年12月31日,后付费融合套餐、单宽、e6用户均可使用9000积分换半年的高清宽带互联网视听(时尚包)。</p><br /><p class='hightlight'>积分不够的用户还可以参加宽带互联网视听免费体验活动,预存宽带费用即可免费使用宽带互联网视听三个月!</p><!--demoEnd--></td></tr></tbody></table><p> </p><p> </p>";
System.out.println(str.replaceAll("<!--demoStart-->.+<!--demoEnd-->", ""));
[其他解释]
准备睡觉了..给你写了个,删除demo标签之间所有非标签文字的..
看看能不能用吧
public static void main(String[] args) {
String content = "<table border=\"0\" width=\"650\">"
+ "<tbody><tr><td valign=\"top\" rowspan=\"2\" width=\"383\">"
+ "<!--demoStart-->"
+ "<br /><div class=\"jfitv_cons\"><dl><dt>稳定高速的宽带网络,是您的必然之选!</dt>"
+ "<dd>天翼宽带,覆盖广,上网快,覆盖广东98%地区,最高速率可达100M,下载大片,"
+ "5G的文件原来耗时1小时,现在只需10分钟!</dd>"
+ "<dt>7×24小时的服务团队,给您最到位的支持!</dt>"
+ "<dd>10000号服务热线7×24小时不间断的售前售后服务,同时为您提供网上营业厅、掌上营业厅、短信营业厅、自助服务终端等多种服务方式,给您带来最贴心到位的服务与支持。</dd>"
+ "<dt>完善的客服渠道,第一时间解除您的疑虑!</dt>"
+ "<dd>包括10000号客服中心、网上营业厅、掌上营业厅、QQ客服和实体营业厅的客户服务渠道体系,完善实施\"一站式服务\"。</dd>"
+ "<dt>专业的售后服务团队,免除您后顾之忧!</dt>"
+ "<dd>广东电信覆盖率高达98%,在全省21地市分设有办事机构,"
+ "依托这些办事机构建立起了能第一时间响应客户需求的售后服务网络,秉承\"用户至上,用心服务\"的理念,"
+ "为您彻底免除后顾之忧。</dd>"
+ "</dl></div><!--demoEnd--></td>"
+ "<td height=\"206\" valign=\"top\" width=\"250\">"
+ "<!--demoStart--><img style=\"margin: 0px; float: none\" alt=\"\" "
+ "src=\"http://172.18.8.6:8088/gdzhenqiEPG/userupload/null/20121109/20121109112640_J4Z_244x159.jpg\" />"
+ "<!--demoEnd--></td></tr><tr><td height=\"251\" valign=\"top\"> <!--demoStart-->"
+ "<br /><p class=\"hightlight\">"
+ "即日起至2012年12月31日,后付费融合套餐、单宽、e6用户均可使用9000积分换半年的高清宽带互联网视听(时尚包)。"
+ "</p><br /><p class=\"hightlight\">积分不够的用户还可以参加宽带互联网视听免费体验活动,预存宽带费用即可免费使用宽带"
+ "互联网视听三个月!</p><!--demoEnd-->" + "</td></tr></tbody></table>"
+ "<p> </p><p> </p>";
StringBuffer resultBuffer = new StringBuffer();
Pattern outerPattern = Pattern.compile("(?is)<!--demoStart-->.+?<!--demoEnd-->");
Pattern innerPattern = Pattern.compile("(?<=>)[^<]+?(?=<)");
Matcher outerMatcher = outerPattern.matcher(content);
while(outerMatcher.find()){
String innerContent = outerMatcher.group();
StringBuffer innerBuffer = new StringBuffer();
Matcher innerMatcher = innerPattern.matcher(innerContent);
while(innerMatcher.find()){
innerMatcher.appendReplacement(innerBuffer, "");
}
innerMatcher.appendTail(innerBuffer);
outerMatcher.appendReplacement(resultBuffer, innerBuffer.toString());
}
outerMatcher.appendTail(resultBuffer);
System.out.println(resultBuffer);
}
结果是
<table border="0" width="650"><tbody><tr><td valign="top" rowspan="2" width="383"><!--demoStart--><br /><div class="jfitv_cons"><dl><dt></dt><dd></dd><dt></dt><dd></dd><dt></dt><dd></dd><dt></dt><dd></dd></dl></div><!--demoEnd--></td><td height="206" valign="top" width="250"><!--demoStart--><img style="margin: 0px; float: none" alt="一个比较绕的正则有关问题" src="http://172.18.8.6:8088/gdzhenqiEPG/userupload/null/20121109/20121109112640_J4Z_244x159.jpg" /><!--demoEnd--></td></tr><tr><td height="251" valign="top"> <!--demoStart--><br /><p class="hightlight"></p><br /><p class="hightlight"></p><!--demoEnd--></td></tr></tbody></table><p> </p><p> </p>
[其他解释]
天。。。跟你前面所说的完全不是一回事。。。
你顶楼要求的是“保留table 的标签等”,如果是全清空,会相对容易些。
试试这样:
System.out.println(str.replaceAll("<!--demoStart-->(.
[其他解释]
分成两步来走吧:
1、定位截取出 <!--demoStar--> 和 <!--demoEnd> 之间的内容;
2、将这部分内容,清除掉标签以外的文字。
话说用正则似乎确实不怎么方便,还不如用有穷自动机原理自己写一个。
[其他解释]
这个的话 如果遇到数据库 的html 有换行的 就失败
有没有方法解决?换行的问题?
[其他解释]
我调试了下 不行!~ 各位看看 我的正则 哪里出错 我对着网上来改的
String res = "";
String srcHtml = getSrcHtml();
java.util.regex.Pattern p_demo;
java.util.regex.Matcher m_demo;
String regEx_demo = "<!--[//s]*?demoStart[^-->]*?>[//s//S]*?<!--[//s]*?///[//s]*?demoEnd[//s]*?-->";
p_demo = Pattern.compile(regEx_demo, Pattern.CASE_INSENSITIVE);
m_demo = p_demo.matcher(srcHtml);
res = m_demo.replaceAll("");
[其他解释]
<!--demoStart-->/S+<!--demoEnd-->
这样不知道可以不?
[其他解释]
没看懂你的意思,如果你是要用一个正则来达到
"删除<!--demoStar--><!--demoEnd>之间的字,并保留其中所有表格的标签"
这个我看真心做不到(也许是我学的挫,等高人),
用两次正则,先取<!--demoStar--><!--demoEnd>之间的内容,然后再替换应该可以
顺带说一句:
"<!--[//s]*?demoStart[^-->]*?>[//s//S]*?<!--[//s]*?///[//s]*?demoEnd[//s]*?-->";
这个根本就是错的,
连[^-->]是什么意思都没弄清楚
[其他解释]
你以字符串的形式读出来,就不会有问题。
[其他解释]
就是 要 把<!--demoStar--><!--demoEnd>之间的内容 清空
两次正则? 不太明白
小弟 正则 超级烂,见笑了
[其他解释]
你说的清空,是指把比如这段
<!--demoStart--><br /><p class="hightlight">即日起至2012年12月31日,后付费融合套餐、单宽、e6用户均可使用9000积分换半年的高清宽带互联网视听(时尚包)。</p><br /><p class="hightlight">积分不够的用户还可以参加宽带互联网视听免费体验活动,预存宽带费用即可免费使用宽带互联网视听三个月!</p><!--demoEnd-->
清空后变成
<!--demoStart--><br /><p class="hightlight"></p><br /><p class="hightlight"></p><!--demoEnd-->
这样吧?
我的意思跟1楼一样,只能发别把demo这个标签之间的内容提出来,然后替换调换,再拼回字符串去
[其他解释]
先好多谢 这位大侠给我这么多的指引!~
但我需要 <!--demoStart-->标签 到<!--demoEnd--> 中间的所有内容都需要 清空!~
那个代码 需要如何修改?
[其他解释]
\\s)*<!--demoEnd-->", ""));
[其他解释]
哦,这样啊?
你看这个能运行不
System.out.println(content.replaceAll("(?is)<!--demoStart-->.+?<!--demoEnd-->", ""));
<table border="0" width="650"><tbody><tr><td valign="top" rowspan="2" width="383"></td><td height="206" valign="top" width="250"></td></tr><tr><td height="251" valign="top"> </td></tr></tbody></table><p> </p><p> </p>