正则表达式替换表格中的

的问题

kingapex1 2008-06-16 10:24:06
一个表格:
Html代码

<table cellspacing="0" cellpadding="0" align="center" border="1">
<tbody>
<tr>
<td width="143">adfa时间</td>
<td width="122">adfds<p>招聘会类型</p></td>
<td width="289">fsfs<p><strong>主办单位 </strong></p></td>
</tr> ........ 还有一些类似tr
</tbody>
</table>

<table cellspacing="0" cellpadding="0" align="center" border="1">
<tbody>
<tr>
<td width="143">adfa时间</td>
<td width="122">adfds<p>招聘会类型</p></td>
<td width="289">fsfs<p><strong>主办单位</strong></p></td>
</tr> ........ 还有一些类似tr
</tbody>
</table>




想通过正则表达式将<p>和</p>替换成"#"号,先试着匹配各td如下:
Java代码
String regEx = "(<td.[^<]*>)(.([^<])([^/])([^t])([^d])*)(</td>)";   
Pattern p = Pattern.compile(regEx, 2 | Pattern.DOTALL);
Matcher m = p.matcher(content);
int i=1;
while(m.find()){
String group = m.group();
System.out.println( i + "->" + group);
i++;
}

String regEx = "(<td.[^<]*>)(.([^<])([^/])([^t])([^d])*)(</td>)";
Pattern p = Pattern.compile(regEx, 2 | Pattern.DOTALL);
Matcher m = p.matcher(content);
int i=1;
while(m.find()){
String group = m.group();
System.out.println( i + "->" + group);
i++;
}


可以匹配出td

但换为如下正则:
Java代码
(<td.[^<]*>)(<p)(.([^<])([^/])([^t])([^d])*)(</td>)  

(<td.[^<]*>)(<p)(.([^<])([^/])([^t])([^d])*)(</td>),

却不能有任何匹配,望大家帮忙,谢谢。
...全文
205 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingapex1 2008-06-18
  • 打赏
  • 举报
回复
成了,接下了仔细研究一下,谢谢
  • 打赏
  • 举报
回复
为了达到更好的兼容性,在表达式中的 p 后面加上 \\b
  • 打赏
  • 举报
回复
如果字符串只有一个的话,可以直接采用上面 String 的 replaceAll 方法。

如果字符串很多的话,为了让表达式能够重用,建议采用下面的方法:

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher("");

str = matcher.reset(str).replaceAll("#");


每处理一个用 reset 重置字符串,这样这个表达式就能重用了,可以节省表达式编译的时间。
  • 打赏
  • 举报
回复
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>)";
kingapex1 2008-06-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 bao110908 的回复:]
哎,感觉回答问题越来越累了……

<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"
align=left>

是要把这一长串和后面的 </P> 这些串都换成 # 么?
[/Quote]

不好意思,我没有说清楚,
需要是将<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"
align=left> 中的 'p' 这个字符换成 # ,不是将这一长串全都替换
其实最终的目的是:在一段文字中先分页,再插入广告,分页靠的是<p> ,插入广告也是靠的是<p>,所以先将表格的<p..字符换成 <#..,分完页,插完广告然后再替换回来。
kingapex1 2008-06-17
  • 打赏
  • 举报
回复
非常感谢,但如果为以下的情况不能匹配<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>
  • 打赏
  • 举报
回复
还有 <o:p> 和 </o:p> 这些要换么?

连个说明、示例都没有……
  • 打赏
  • 举报
回复
哎,感觉回答问题越来越累了……

<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"
align=left>

是要把这一长串和后面的 </P> 这些串都换成 # 么?
kingapex1 2008-06-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bao110908 的回复:]
不好意思,你在 4 楼说的这种情况我不是很懂。比如说,要把什么换成什么呢?
[/Quote]
我在1楼中举的是一个要操作的数据的例子,而在5楼贴的是用户真实的数据,

下面的正则表达式对于1楼的数据是正确的

String regex = "(?s)</?p>(?=(?:(?!<td).)*</td>)";
str = str.replaceAll(regex, "#");
System.out.println(str);


但对于我在5楼中帖出的数据是不正确的。

  • 打赏
  • 举报
回复
不好意思,你在 4 楼说的这种情况我不是很懂。比如说,要把什么换成什么呢?
zero1111 2008-06-16
  • 打赏
  • 举报
回复
replaceAll比较好,向火龙果学习.
  • 打赏
  • 举报
回复
改一下

String regex = "(?s)</?p>(?=(?:(?!<td).)*</td>)";
str = str.replaceAll(regex, "#");
System.out.println(str);
  • 打赏
  • 举报
回复
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);
完整测试代码 [removed] var str='

';\nstr='

'; str+=''; str+='<td id=asdfj clas

62,615

社区成员

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

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