正则表达式能搞定这个不?

花木兰1闪21A 2013-12-24 09:47:49
String str="<u>sdf<i>ewr<b>3<4</b>43>24</i>234<>234</u>"
\
我要取到任意html标签中的内容,这里是 sdf ewr 3<4 43>24 234<>234 我就是问正则能不能搞的定,不要说其它的。。。
...全文
203 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
花木兰1闪21A 2013-12-24
  • 打赏
  • 举报
回复
引用 8 楼 suciver 的回复:
[quote=引用 7 楼 suciver 的回复:] [quote=引用 6 楼 tlfu_12344 的回复:] 嗯,这样能取到,只是还有点问题。。其实最终我想得到是把u标签之间非html标签都加上u标签,也就是这样:"<u>sdf</u><i><u>ewr</u><b><u>3<4</u></b><u>43>24</u></i><u>234<>234</u>",也就是取到这样的值后分别加上u标签后还是要放回去的,可以这样都干掉了。。。。,我一直相信正则比较强大,无奈自己写不出这样的正则来。。。
为啥要都加上u标签呢?搞不懂你的需求[/quote] 楼主是不是想把这些地方加上u标签后,方便以后取值就都用u标签来匹配纯文本就不用管其它标签了.如果是这样的话,只要把原来u标签内容获得后,在把里面的非u标签的html标签都替换成u标签效果也是一样的,这样一样可以后面只要用u标签来取值

String str="<u>sdf<i>ewr<b>3<4</b>43>24</i>234<>234</u>";
		Pattern p=Pattern.compile("<u>.*?</u>");
		Matcher m=p.matcher(str);
		if(m.find()){
		  str=m.group();//得到标签的内容
		//利用while循环如果内容中还有标签,把标签去掉只保留内容,直到剩下纯文本
		  while(str.matches(".*<([^u]+)>(.*?)</\\1>.*")){
		    str=str.replaceAll("<([^u]+)>(.*?)</\\1>","<u>$2</u>");
		  }
		  System.out.println(str);
		}
[/quote]不是的,因为这个html在网页上是可以展示的,而我是要将htm转成word,有问题是u标签里如果还有其它标签的话,这个u标签是无效的,到word中是没有效果的,所以之前我要把us标签中的内容一个一个加上才可以。
suciver 2013-12-24
  • 打赏
  • 举报
回复
引用 7 楼 suciver 的回复:
[quote=引用 6 楼 tlfu_12344 的回复:] 嗯,这样能取到,只是还有点问题。。其实最终我想得到是把u标签之间非html标签都加上u标签,也就是这样:"<u>sdf</u><i><u>ewr</u><b><u>3<4</u></b><u>43>24</u></i><u>234<>234</u>",也就是取到这样的值后分别加上u标签后还是要放回去的,可以这样都干掉了。。。。,我一直相信正则比较强大,无奈自己写不出这样的正则来。。。
为啥要都加上u标签呢?搞不懂你的需求[/quote] 楼主是不是想把这些地方加上u标签后,方便以后取值就都用u标签来匹配纯文本就不用管其它标签了.如果是这样的话,只要把原来u标签内容获得后,在把里面的非u标签的html标签都替换成u标签效果也是一样的,这样一样可以后面只要用u标签来取值

String str="<u>sdf<i>ewr<b>3<4</b>43>24</i>234<>234</u>";
		Pattern p=Pattern.compile("<u>.*?</u>");
		Matcher m=p.matcher(str);
		if(m.find()){
		  str=m.group();//得到标签的内容
		//利用while循环如果内容中还有标签,把标签去掉只保留内容,直到剩下纯文本
		  while(str.matches(".*<([^u]+)>(.*?)</\\1>.*")){
		    str=str.replaceAll("<([^u]+)>(.*?)</\\1>","<u>$2</u>");
		  }
		  System.out.println(str);
		}
suciver 2013-12-24
  • 打赏
  • 举报
回复
引用 6 楼 tlfu_12344 的回复:
嗯,这样能取到,只是还有点问题。。其实最终我想得到是把u标签之间非html标签都加上u标签,也就是这样:"<u>sdf</u><i><u>ewr</u><b><u>3<4</u></b><u>43>24</u></i><u>234<>234</u>",也就是取到这样的值后分别加上u标签后还是要放回去的,可以这样都干掉了。。。。,我一直相信正则比较强大,无奈自己写不出这样的正则来。。。
为啥要都加上u标签呢?搞不懂你的需求
花木兰1闪21A 2013-12-24
  • 打赏
  • 举报
回复
引用 5 楼 suciver 的回复:
楼主这个标签里的内容又有标签这个要取去除标签的内容不仅要搜索匹配还要进行持续性的替换

String str="<u>sdf<i>ewr<b>3<4</b>43>24</i>234<>234</u>";
Pattern p=Pattern.compile("<(\\w+)>(.*?)</\\1>");
Matcher m=p.matcher(str);
if(m.find()){
  str=m.group(2);//得到标签的内容
//利用while循环如果内容中还有标签,把标签去掉只保留内容,直到剩下纯文本
  while(str.matches(".*<(\\w+)>(.*?)</\\1>.*")){
    str=str.replaceAll("<(\\w+)>(.*?)</\\1>"," $2 ");
  }
  System.out.println(str);
}
嗯,这样能取到,只是还有点问题。。其实最终我想得到是把u标签之间非html标签都加上u标签,也就是这样:"<u>sdf</u><i><u>ewr</u><b><u>3<4</u></b><u>43>24</u></i><u>234<>234</u>",也就是取到这样的值后分别加上u标签后还是要放回去的,可以这样都干掉了。。。。,我一直相信正则比较强大,无奈自己写不出这样的正则来。。。
suciver 2013-12-24
  • 打赏
  • 举报
回复
楼主这个标签里的内容又有标签这个要取去除标签的内容不仅要搜索匹配还要进行持续性的替换

String str="<u>sdf<i>ewr<b>3<4</b>43>24</i>234<>234</u>";
Pattern p=Pattern.compile("<(\\w+)>(.*?)</\\1>");
Matcher m=p.matcher(str);
if(m.find()){
  str=m.group(2);//得到标签的内容
//利用while循环如果内容中还有标签,把标签去掉只保留内容,直到剩下纯文本
  while(str.matches(".*<(\\w+)>(.*?)</\\1>.*")){
    str=str.replaceAll("<(\\w+)>(.*?)</\\1>"," $2 ");
  }
  System.out.println(str);
}
花木兰1闪21A 2013-12-24
  • 打赏
  • 举报
回复
引用 3 楼 ghostkngiht 的回复:
str.replaceAll("<[a-z/]+?>", " ")
<dsf>不也去掉了嘛,html标签就用【a-z】就行了?这样肯定不行了,而且这些标签后面还有用不能干掉。。。
ghostkngiht 2013-12-24
  • 打赏
  • 举报
回复
str.replaceAll("<[a-z/]+?>", " ")
花木兰1闪21A 2013-12-24
  • 打赏
  • 举报
回复
引用 1 楼 ghostkngiht 的回复:
str.replaceAll("<[\\w/]+?>", " ")
<sdf234>有这样的也是我要的,不是html标签怎么搞?
ghostkngiht 2013-12-24
  • 打赏
  • 举报
回复
str.replaceAll("<[\\w/]+?>", " ")
suciver 2013-12-24
  • 打赏
  • 举报
回复
引用 11 楼 tlfu_12344 的回复:
不是的,因为这个html在网页上是可以展示的,而我是要将htm转成word,有问题是u标签里如果还有其它标签的话,这个u标签是无效的,到word中是没有效果的,所以之前我要把us标签中的内容一个一个加上才可以。
楼主就等于要把u标签里面的纯文本的地方都要加上u标签了这个就比较复杂了不关是正则的问题还要一些逻辑处理[/quote]嗯 我目前是用jsoup+正则搞定的,写正则写不出来没办法。。。就想知道正则行不行,是不是偶能力有限。。。[/quote] 正则也是可以的就是逻辑上复杂了一点要进行下递归添加刚有空就写了下

public static void main(String[] args) throws Exception {
		String str="<u>sdf<i>ewr<b>3<4</b>43>24</i>234<>234</u>";
		System.out.println(str);
		Pattern p=Pattern.compile("<u>(.*?)</u>");
		Matcher m=p.matcher(str);
		if(m.find()){
		  StringBuilder sb=new StringBuilder();
		  str=m.group(1);//获得u标签里的内容
		  replace(str,sb);//内容中纯文本的地方都包上u标签
		  System.out.println(sb);
		}
	}
	private static void replace(String str,StringBuilder sb){
		Matcher m=Pattern.compile("<([^u]+)>(.*?)</\\1>").matcher(str);
		int end=0;//这个用于记录上一次匹配的结尾
		while(m.find()){
			int start=m.start();
			//如果说匹配的起始小于上一次的结尾说明前面已经是纯文本了就要用u标签包起来
			if(start>end){
				sb.append("<u>").append(str.substring(end,start)).append("</u>");
			}
			//把原来的标签内容原样添加上去
			sb.append("<").append(m.group(1)).append(">");
			//如果标签之中的内容仍然有标签那么递归调用
			if(m.group(2).matches(".*<([^u]+)>(.*?)</\\1>.*")){
				replace(m.group(2),sb);
			}else{//没有标签了就是纯文本直接用u标签包上
				sb.append("<u>").append(m.group(2)).append("</u>");
			}
			//在把原来的标签内容结尾原样加上上去
			sb.append("</").append(m.group(1)).append(">");
			//改变上一次的匹配结尾用于最后的内容添加
			end=m.end();
		}
		//当最后匹配的内容未到末尾时说明后面还有纯文本再把后面的内容用u标签抱起来
		if(end<str.length()-1){
			sb.append("<u>").append(str.substring(end)).append("</u>");
		}
	}
花木兰1闪21A 2013-12-24
  • 打赏
  • 举报
回复
引用 10 楼 suciver 的回复:
[quote=引用 9 楼 tlfu_12344 的回复:] [quote=引用 8 楼 suciver 的回复:] [quote=引用 7 楼 suciver 的回复:] [quote=引用 6 楼 tlfu_12344 的回复:] 嗯,这样能取到,只是还有点问题。。其实最终我想得到是把u标签之间非html标签都加上u标签,也就是这样:"<u>sdf</u><i><u>ewr</u><b><u>3<4</u></b><u>43>24</u></i><u>234<>234</u>",也就是取到这样的值后分别加上u标签后还是要放回去的,可以这样都干掉了。。。。,我一直相信正则比较强大,无奈自己写不出这样的正则来。。。
为啥要都加上u标签呢?搞不懂你的需求[/quote] 楼主是不是想把这些地方加上u标签后,方便以后取值就都用u标签来匹配纯文本就不用管其它标签了.如果是这样的话,只要把原来u标签内容获得后,在把里面的非u标签的html标签都替换成u标签效果也是一样的,这样一样可以后面只要用u标签来取值

String str="<u>sdf<i>ewr<b>3<4</b>43>24</i>234<>234</u>";
		Pattern p=Pattern.compile("<u>.*?</u>");
		Matcher m=p.matcher(str);
		if(m.find()){
		  str=m.group();//得到标签的内容
		//利用while循环如果内容中还有标签,把标签去掉只保留内容,直到剩下纯文本
		  while(str.matches(".*<([^u]+)>(.*?)</\\1>.*")){
		    str=str.replaceAll("<([^u]+)>(.*?)</\\1>","<u>$2</u>");
		  }
		  System.out.println(str);
		}
[/quote]不是的,因为这个html在网页上是可以展示的,而我是要将htm转成word,有问题是u标签里如果还有其它标签的话,这个u标签是无效的,到word中是没有效果的,所以之前我要把us标签中的内容一个一个加上才可以。[/quote] 楼主就等于要把u标签里面的纯文本的地方都要加上u标签了这个就比较复杂了不关是正则的问题还要一些逻辑处理[/quote]嗯 我目前是用jsoup+正则搞定的,写正则写不出来没办法。。。就想知道正则行不行,是不是偶能力有限。。。
suciver 2013-12-24
  • 打赏
  • 举报
回复
引用 9 楼 tlfu_12344 的回复:
[quote=引用 8 楼 suciver 的回复:] [quote=引用 7 楼 suciver 的回复:] [quote=引用 6 楼 tlfu_12344 的回复:] 嗯,这样能取到,只是还有点问题。。其实最终我想得到是把u标签之间非html标签都加上u标签,也就是这样:"<u>sdf</u><i><u>ewr</u><b><u>3<4</u></b><u>43>24</u></i><u>234<>234</u>",也就是取到这样的值后分别加上u标签后还是要放回去的,可以这样都干掉了。。。。,我一直相信正则比较强大,无奈自己写不出这样的正则来。。。
为啥要都加上u标签呢?搞不懂你的需求[/quote] 楼主是不是想把这些地方加上u标签后,方便以后取值就都用u标签来匹配纯文本就不用管其它标签了.如果是这样的话,只要把原来u标签内容获得后,在把里面的非u标签的html标签都替换成u标签效果也是一样的,这样一样可以后面只要用u标签来取值

String str="<u>sdf<i>ewr<b>3<4</b>43>24</i>234<>234</u>";
		Pattern p=Pattern.compile("<u>.*?</u>");
		Matcher m=p.matcher(str);
		if(m.find()){
		  str=m.group();//得到标签的内容
		//利用while循环如果内容中还有标签,把标签去掉只保留内容,直到剩下纯文本
		  while(str.matches(".*<([^u]+)>(.*?)</\\1>.*")){
		    str=str.replaceAll("<([^u]+)>(.*?)</\\1>","<u>$2</u>");
		  }
		  System.out.println(str);
		}
[/quote]不是的,因为这个html在网页上是可以展示的,而我是要将htm转成word,有问题是u标签里如果还有其它标签的话,这个u标签是无效的,到word中是没有效果的,所以之前我要把us标签中的内容一个一个加上才可以。[/quote] 楼主就等于要把u标签里面的纯文本的地方都要加上u标签了这个就比较复杂了不关是正则的问题还要一些逻辑处理

62,614

社区成员

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

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