一个比较绕的正则问题

topbasemaster 2012-11-14 04:10:28
现在要清除 <!--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>
...全文
1774 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
topbasemaster 2012-11-19
  • 打赏
  • 举报
回复
谢谢各位了!~ 结贴晚了点!~ 你们帮我了好大忙!~
topbasemaster 2012-11-15
  • 打赏
  • 举报
回复
引用 12 楼 ldh911 的回复:
引用 11 楼 topbasemaster 的回复:但我需要 <!--demoStart-->标签 到<!--demoEnd--> 中间的所有内容都需要 清空! 天。。。跟你前面所说的完全不是一回事。。。 你顶楼要求的是“保留table 的标签等”,如果是全清空,会相对容易些。 试试这样: System.out.println(str.replaceA……
不行喔!~ 报错 Exception in thread "main" java.lang.StackOverflowError at java.util.regex.Pattern$CharProperty.match(Pattern.java:3343)
wapigzhu 2012-11-15
  • 打赏
  • 举报
回复
引用 8 楼 topbasemaster 的回复:
引用 6 楼 wapigzhu 的回复:引用 4 楼 topbasemaster 的回复:我调试了下 不行!~ 各位看看 我的正则 哪里出错 我对着网上来改的 Java code?12345678910 String res = ""; String srcHtml = getSrcHtml(); ja……
你说的清空,是指把比如这段

<!--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这个标签之间的内容提出来,然后替换调换,再拼回字符串去
topbasemaster 2012-11-15
  • 打赏
  • 举报
回复
引用 6 楼 wapigzhu 的回复:
引用 4 楼 topbasemaster 的回复:我调试了下 不行!~ 各位看看 我的正则 哪里出错 我对着网上来改的 Java code?12345678910 String res = ""; String srcHtml = getSrcHtml(); java.util.regex.Patter……
就是 要 把<!--demoStar--><!--demoEnd>之间的内容 清空 两次正则? 不太明白 小弟 正则 超级烂,见笑了
MiceRice 2012-11-15
  • 打赏
  • 举报
回复
引用 11 楼 topbasemaster 的回复:
但我需要 <!--demoStart-->标签 到<!--demoEnd--> 中间的所有内容都需要 清空!
天。。。跟你前面所说的完全不是一回事。。。 你顶楼要求的是“保留table 的标签等”,如果是全清空,会相对容易些。 试试这样: System.out.println(str.replaceAll("<!--demoStart-->(.|\\s)*<!--demoEnd-->", ""));
topbasemaster 2012-11-15
  • 打赏
  • 举报
回复
引用 10 楼 wapigzhu 的回复:
准备睡觉了..给你写了个,删除demo标签之间所有非标签文字的.. 看看能不能用吧 Java code?12345678910111213141516171819202122232425262728293031323334353637383940414243public static void main(String[] args) { String c……
先好多谢 这位大侠给我这么多的指引!~ 但我需要 <!--demoStart-->标签 到<!--demoEnd--> 中间的所有内容都需要 清空!~ 那个代码 需要如何修改?
wapigzhu 2012-11-15
  • 打赏
  • 举报
回复
引用 11 楼 topbasemaster 的回复:
引用 10 楼 wapigzhu 的回复:准备睡觉了..给你写了个,删除demo标签之间所有非标签文字的.. 看看能不能用吧 Java code?12345678910111213141516171819202122232425262728293031323334353637383940414243public static void main(String[] ar……
哦,这样啊? 你看这个能运行不

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>
wapigzhu 2012-11-15
  • 打赏
  • 举报
回复
准备睡觉了..给你写了个,删除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>
zxhcloth 2012-11-14
  • 打赏
  • 举报
回复
引用 3 楼 topbasemaster 的回复:
引用 2 楼 zxhcloth 的回复:Java code?1234String str = "<table border='0' width='650'><tbody><tr><td valign='top' rowspan='2' width='383'><!--demoStart--><br /><div class='jfitv_cons'><dl><dt>稳定高…… 这个的话 如果遇到数据库 的html 有换行的 就失败 有没有方法解决?换行的问题?
你以字符串的形式读出来,就不会有问题。
wapigzhu 2012-11-14
  • 打赏
  • 举报
回复
引用 4 楼 topbasemaster 的回复:
我调试了下 不行!~ 各位看看 我的正则 哪里出错 我对着网上来改的 Java code?12345678910 String res = ""; String srcHtml = getSrcHtml(); java.util.regex.Pattern p_demo; ……
没看懂你的意思,如果你是要用一个正则来达到 "删除<!--demoStar--><!--demoEnd>之间的字,并保留其中所有表格的标签" 这个我看真心做不到(也许是我学的挫,等高人), 用两次正则,先取<!--demoStar--><!--demoEnd>之间的内容,然后再替换应该可以 顺带说一句: "<!--[//s]*?demoStart[^-->]*?>[//s//S]*?<!--[//s]*?///[//s]*?demoEnd[//s]*?-->"; 这个根本就是错的, 连[^-->]是什么意思都没弄清楚
C860 2012-11-14
  • 打赏
  • 举报
回复
引用 3 楼 topbasemaster 的回复:
引用 2 楼 zxhcloth 的回复:Java code?1234String str = "<table border='0' width='650'><tbody><tr><td valign='top' rowspan='2' width='383'><!--demoStart--><br /><div class='jfitv_cons'><dl><dt>稳定高……
<!--demoStart-->/S+<!--demoEnd--> 这样不知道可以不?
topbasemaster 2012-11-14
  • 打赏
  • 举报
回复
我调试了下 不行!~ 各位看看 我的正则 哪里出错 我对着网上来改的

	    	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("");
topbasemaster 2012-11-14
  • 打赏
  • 举报
回复
引用 2 楼 zxhcloth 的回复:
Java code?1234String str = "<table border='0' width='650'><tbody><tr><td valign='top' rowspan='2' width='383'><!--demoStart--><br /><div class='jfitv_cons'><dl><dt>稳定高速的宽带网络,是您的必然之选!</dt>……
这个的话 如果遇到数据库 的html 有换行的 就失败 有没有方法解决?换行的问题?
zxhcloth 2012-11-14
  • 打赏
  • 举报
回复

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-->", ""));
MiceRice 2012-11-14
  • 打赏
  • 举报
回复
分成两步来走吧: 1、定位截取出 <!--demoStar--> 和 <!--demoEnd> 之间的内容; 2、将这部分内容,清除掉标签以外的文字。 话说用正则似乎确实不怎么方便,还不如用有穷自动机原理自己写一个。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧