正则表达式替换表格中的<p>的问题 本帖最后由 java2000_net 于 2008-06-16 22:43:01 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 import java.util.regex.Pattern;import java.util.regex.Matcher;public class Test { public static void main(String[] args) { String str = "<table cellspacing=\"0\" cellpadding=\"0\" align=\"center\" border=\"1\">\n" + " <tbody>\n" + " <tr>\n" + " <td width=\"143\">adfa时间</td>\n" + " <td width=\"122\">adfds<p>招聘会类型</p></td>\n" + " <td width=\"289\">fsfs<p><strong>主办单位 </strong></p></td>\n" + " </tr> ........ 还有一些类似tr\n" + " </tbody>\n" + "</table>\n" + "\n" + "<table cellspacing=\"0\" cellpadding=\"0\" align=\"center\" border=\"1\">\n" + " <tbody>\n" + " <tr>\n" + " <td width=\"143\">adfa时间</td>\n" + " <td width=\"122\">adfds<p>招聘会类型</p></td>\n" + " <td width=\"289\">fsfs<p><strong>主办单位</strong></p></td>\n" + " </tr> ........ 还有一些类似tr\n" + " </tbody>\n" + "</table>"; String regex = "<td[^>]*>(.*?)</td>"; Pattern p = Pattern.compile(regex, Pattern.DOTALL); Matcher m = p.matcher(str); while(m.find()) { System.out.println(m.group(1)); } }}String regex = "</?p>(?=(?:(?!<td).)*</td>)";str = str.replaceAll(regex, "#");System.out.println(str); 改一下String regex = "(?s)</?p>(?=(?:(?!<td).)*</td>)";str = str.replaceAll(regex, "#");System.out.println(str); replaceAll比较好,向火龙果学习. 非常感谢,但如果为以下的情况不能匹配<p.. : <TABLE class=MsoNormalTable style="WIDTH: 450pt; mso-cellspacing: .7pt" cellSpacing=1 cellPadding=0 width=600 border=1><TBODY><TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes"><TD style="BORDER-RIGHT: #ece9d8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ece9d8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent"><P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> 成龙、杨受成<SPAN lang=EN-US> 1000</SPAN>万<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P></TD><TD style="BORDER-RIGHT: #ece9d8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ece9d8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent"><P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> </SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">李连杰<SPAN lang=EN-US>“</SPAN>壹基金<SPAN lang=EN-US>” 100</SPAN>万<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P></TD></TR></table> 我在1楼中举的是一个要操作的数据的例子,而在5楼贴的是用户真实的数据,下面的正则表达式对于1楼的数据是正确的String regex = "(?s)</?p>(?=(?:(?!<td).)*</td>)";str = str.replaceAll(regex, "#");System.out.println(str);但对于我在5楼中帖出的数据是不正确的。 哎,感觉回答问题越来越累了……<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left>是要把这一长串和后面的 </P> 这些串都换成 # 么? 还有 <o:p> 和 </o:p> 这些要换么?连个说明、示例都没有…… 不好意思,我没有说清楚,需要是将<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left> 中的 'p' 这个字符换成 # ,不是将这一长串全都替换其实最终的目的是:在一段文字中先分页,再插入广告,分页靠的是<p> ,插入广告也是靠的是<p>,所以先将表格的<p..字符换成 <#..,分完页,插完广告然后再替换回来。 public class Test { public static void main(String[] args) { String str = "<TABLE class=MsoNormalTable style=\"WIDTH: 450pt; mso-cellspacing: .7pt\" \n" + "cellSpacing=1 cellPadding=0 width=600 border=1>\n" + "<TBODY>\n" + "<TR style=\"mso-yfti-irow: 0; mso-yfti-firstrow: yes\">\n" + "<TD \n" + "style=\"BORDER-RIGHT: #ece9d8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ece9d8; \n" + "PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ece9d8; PADDING-TOP: 0.75pt; \n" + "BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent\">\n" + "<P class=MsoNormal \n" + "style=\"MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan\" \n" + "align=left><SPAN \n" + "style=\"FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt\">\n" + " 成龙、杨受成<SPAN lang=EN-US> 1000</SPAN>万<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P></TD>\n" + "<TD \n" + "style=\"BORDER-RIGHT: #ece9d8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ece9d8; \n" + "PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ece9d8; PADDING-TOP: 0.75pt; \n" + "BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent\">\n" + "<P class=MsoNormal \n" + "style=\"MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan\" \n" + "align=left><SPAN \n" + "lang=EN-US style=\"FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt\">\n" + " </SPAN><SPAN style=\"FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; \n" + "mso-font-kerning: 0pt\">\n" + "李连杰<SPAN lang=EN-US>“</SPAN>壹基金<SPAN lang=EN-US>” 100</SPAN>万<SPAN lang=EN-US><o:p></o:p></SPAN>\n" + "</SPAN></P></TD></TR></table>\n" + ""; String regex = "(?is)(?<=</?)p(?=(?:(?!<td).)*</td>)"; str = str.replaceAll(regex, "#"); System.out.println(str); }}这样不知道行么?上面只替换了 <td> 和 </td> 间的 P,需要注意的是 <td></td> 内不能再含有<td> 之类的字符。如果 <td> 中的 <o:p> 和 </o:p> 也要换的话,把表达式改为:String regex = "(?is)(?<=</?(?:o:)?)p(?=(?:(?!<td).)*</td>)"; 如果字符串只有一个的话,可以直接采用上面 String 的 replaceAll 方法。如果字符串很多的话,为了让表达式能够重用,建议采用下面的方法:Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher("");str = matcher.reset(str).replaceAll("#");每处理一个用 reset 重置字符串,这样这个表达式就能重用了,可以节省表达式编译的时间。 关于生成一组随机数 java接口 一个关于JAVA继承和重载的问题 如何求堆栈的长度? 刚学习JAVA,不知道JAVA里面有多少需要去记住的词汇? mysql下分段查询应该如何写sql语句?待查询的表没有主键 请问在xp下怎么设置jdk1.3的路径?? 简单问题---怎么关闭不了? UltraEdit中 键盘被锁住了 四级挂了,给分,气死了 请教下怎么防止页面短时间内刷新过多? winCE上开发的java程序乱码
import java.util.regex.Matcher;public class Test { public static void main(String[] args) {
String str =
"<table cellspacing=\"0\" cellpadding=\"0\" align=\"center\" border=\"1\">\n" +
" <tbody>\n" +
" <tr>\n" +
" <td width=\"143\">adfa时间</td>\n" +
" <td width=\"122\">adfds<p>招聘会类型</p></td>\n" +
" <td width=\"289\">fsfs<p><strong>主办单位 </strong></p></td>\n" +
" </tr> ........ 还有一些类似tr\n" +
" </tbody>\n" +
"</table>\n" +
"\n" +
"<table cellspacing=\"0\" cellpadding=\"0\" align=\"center\" border=\"1\">\n" +
" <tbody>\n" +
" <tr>\n" +
" <td width=\"143\">adfa时间</td>\n" +
" <td width=\"122\">adfds<p>招聘会类型</p></td>\n" +
" <td width=\"289\">fsfs<p><strong>主办单位</strong></p></td>\n" +
" </tr> ........ 还有一些类似tr\n" +
" </tbody>\n" +
"</table>";
String regex = "<td[^>]*>(.*?)</td>";
Pattern p = Pattern.compile(regex, Pattern.DOTALL);
Matcher m = p.matcher(str);
while(m.find()) {
System.out.println(m.group(1));
}
}
}String regex = "</?p>(?=(?:(?!<td).)*</td>)";
str = str.replaceAll(regex, "#");
System.out.println(str);
str = str.replaceAll(regex, "#");
System.out.println(str);
<TABLE class=MsoNormalTable style="WIDTH: 450pt; mso-cellspacing: .7pt"
cellSpacing=1 cellPadding=0 width=600 border=1>
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
<TD
style="BORDER-RIGHT: #ece9d8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ece9d8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"
align=left><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> 成龙、杨受成<SPAN
lang=EN-US> 1000</SPAN>万<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P></TD>
<TD
style="BORDER-RIGHT: #ece9d8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ece9d8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"
align=left><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> </SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">李连杰<SPAN
lang=EN-US>“</SPAN>壹基金<SPAN lang=EN-US>” 100</SPAN>万<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P></TD></TR>
</table>
str = str.replaceAll(regex, "#");
System.out.println(str);
但对于我在5楼中帖出的数据是不正确的。
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"
align=left>是要把这一长串和后面的 </P> 这些串都换成 # 么?
不好意思,我没有说清楚,
需要是将<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"
align=left> 中的 'p' 这个字符换成 # ,不是将这一长串全都替换
其实最终的目的是:在一段文字中先分页,再插入广告,分页靠的是<p> ,插入广告也是靠的是<p>,所以先将表格的<p..字符换成 <#..,分完页,插完广告然后再替换回来。
String str =
"<TABLE class=MsoNormalTable style=\"WIDTH: 450pt; mso-cellspacing: .7pt\" \n" +
"cellSpacing=1 cellPadding=0 width=600 border=1>\n" +
"<TBODY>\n" +
"<TR style=\"mso-yfti-irow: 0; mso-yfti-firstrow: yes\">\n" +
"<TD \n" +
"style=\"BORDER-RIGHT: #ece9d8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ece9d8; \n" +
"PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ece9d8; PADDING-TOP: 0.75pt; \n" +
"BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent\">\n" +
"<P class=MsoNormal \n" +
"style=\"MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan\" \n" +
"align=left><SPAN \n" +
"style=\"FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt\">\n" +
" 成龙、杨受成<SPAN lang=EN-US> 1000</SPAN>万<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P></TD>\n" +
"<TD \n" +
"style=\"BORDER-RIGHT: #ece9d8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ece9d8; \n" +
"PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ece9d8; PADDING-TOP: 0.75pt; \n" +
"BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent\">\n" +
"<P class=MsoNormal \n" +
"style=\"MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan\" \n" +
"align=left><SPAN \n" +
"lang=EN-US style=\"FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt\">\n" +
" </SPAN><SPAN style=\"FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; \n" +
"mso-font-kerning: 0pt\">\n" +
"李连杰<SPAN lang=EN-US>“</SPAN>壹基金<SPAN lang=EN-US>” 100</SPAN>万<SPAN lang=EN-US><o:p></o:p></SPAN>\n" +
"</SPAN></P></TD></TR></table>\n" +
"";
String regex = "(?is)(?<=</?)p(?=(?:(?!<td).)*</td>)";
str = str.replaceAll(regex, "#");
System.out.println(str);
}
}这样不知道行么?上面只替换了 <td> 和 </td> 间的 P,需要注意的是 <td></td> 内不能再含有
<td> 之类的字符。如果 <td> 中的 <o:p> 和 </o:p> 也要换的话,把表达式改为:String regex = "(?is)(?<=</?(?:o:)?)p(?=(?:(?!<td).)*</td>)";
Matcher matcher = pattern.matcher("");str = matcher.reset(str).replaceAll("#");每处理一个用 reset 重置字符串,这样这个表达式就能重用了,可以节省表达式编译的时间。