本帖最后由 java2000_net 于 2008-06-16 22:43:01 编辑

解决方案 »

  1.   

    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);
      

  2.   

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

  3.   

    replaceAll比较好,向火龙果学习.
      

  4.   

    非常感谢,但如果为以下的情况不能匹配<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">&nbsp;成龙、杨受成<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">&nbsp;</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>
      

  5.   

    我在1楼中举的是一个要操作的数据的例子,而在5楼贴的是用户真实的数据,下面的正则表达式对于1楼的数据是正确的String regex = "(?s)</?p>(?=(?:(?!<td).)*</td>)";
    str = str.replaceAll(regex, "#");
    System.out.println(str);
    但对于我在5楼中帖出的数据是不正确的。
      

  6.   

    哎,感觉回答问题越来越累了……<P class=MsoNormal 
    style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" 
    align=left>是要把这一长串和后面的 </P> 这些串都换成 # 么?
      

  7.   

    还有 <o:p> 和 </o:p> 这些要换么?连个说明、示例都没有……
      

  8.   


    不好意思,我没有说清楚,
    需要是将<P class=MsoNormal 
    style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" 
    align=left> 中的  'p' 这个字符换成 # ,不是将这一长串全都替换
    其实最终的目的是:在一段文字中先分页,再插入广告,分页靠的是<p> ,插入广告也是靠的是<p>,所以先将表格的<p..字符换成 <#..,分完页,插完广告然后再替换回来。
      

  9.   

    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" +
                "&nbsp;成龙、杨受成<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" +
                "&nbsp;</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>)";
      

  10.   

    如果字符串只有一个的话,可以直接采用上面 String 的 replaceAll 方法。如果字符串很多的话,为了让表达式能够重用,建议采用下面的方法:Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher("");str = matcher.reset(str).replaceAll("#");每处理一个用 reset 重置字符串,这样这个表达式就能重用了,可以节省表达式编译的时间。