如下
有字符串如
str=<html><head><title> 333 < 444</title></head><h1> 4 < 6 </h1><h2> 55 < 66</h2><br/></html>
现要求匹配每个标签,如果标签后有内容,需把内容一起匹配
就是说要求结果匹配结果分组如下
1:<html>
2:<head>
3:<title> 333<444
4:</title>
5:</head>
6:<h1> 4 <6
........
我只能做到下面这步,但这样就匹配不到“<”号以及后面的字符了
Matcher m =
      Pattern.compile("(<\\w+>)[^<]*|(</\\w+>)|(<\\w+/>)").matcher(str);请高人不吝指教啊!!!!!!!!!!

解决方案 »

  1.   

    是啊,难就难在又要匹配内容中的 "<" 但又不能匹配标签的“<”
      

  2.   

    根据>找<,就怕会出现多余的>
      

  3.   

    (<\\w+>)\\s*\\d+[^<]\\d+|(</\\w+>)|(<\\w+/>)
      

  4.   

    空白符没补全(<\\w+>)\\s*\\d+\\s*[^<]\\s*\\d+\\s*|(</\\w+>)|(<\\w+/>)
      

  5.   

    需求再说一下阿,没有看懂,先给点建议在<x></x>部分,建议改为"<(\\w+)></(\\1)>",其中\1代表group(1)的内容,也就是第一个\w+对于不需要group,但是又要写括号的,用(?:xxxx)代替(xxxx)
      

  6.   

    package test;import java.util.ArrayList;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class Test { private static String regex = "<(\\w+)>(.*)</\\1>|<(\\w+)/>"; private static Pattern pattern = Pattern.compile(regex); public static void main(String[] args) { String test = "<html><head><title> 333 < 444</title></head><h1> 4 < 6 </h1><h2> 55 < 66</h2><br/></html>"; List list = foo(test);
    for (int i = 0; i < list.size(); i++) {
    String element = (String) list.get(i);
    System.out.println((i + 1) + ": " + element);
    }
    } public static List foo(String element) {
    Matcher m = pattern.matcher(element); List list = new ArrayList();
    while (m.find()) {
    if (m.group().endsWith("/>")) {
    list.add(m.group());
    } else {
    String subelement = m.group(2);
    List sublist = foo(subelement);
    if (sublist.isEmpty()) {
    list.add("<" + m.group(1) + ">" + m.group(2));
    } else {
    list.add("<" + m.group(1) + ">");
    }
    list.addAll(sublist);
    list.add("</" + m.group(1) + ">");
    }
    }
    return list;
    }
    }
      

  7.   

    输出:1: <html>
    2: <head>
    3: <title> 333 < 444
    4: </title>
    5: </head>
    6: <h1> 4 < 6 
    7: </h1>
    8: <h2> 55 < 66
    9: </h2>
    10: <br/>
    11: </html>
      

  8.   

    \<[^\<\>]*>.*?((?=\<[^\<\>]*>)|$)
      

  9.   

    其实shine的算法还是没有彻底解决问题我试了一下,如果如下情况,则上述所列代码无法读取aaaaaaaaaaa
    <html><h1>aaaaaaaaaa</h1></html>
      

  10.   

    如果要在内容中显示成<或>号,那么在源文件里面必定是&lt;或者&gt;
    因此就不存在标签的尖括号和内容的尖括号的混淆问题了吧
      

  11.   

    1: <html>
    2: <h1>aaaaaaaaaa
    3: </h1>
    4: </html>貌似非常之正确...
      

  12.   

    shine你试一下这个<html>aaaaaa<head><title> 333 < 444</title></head><h1> 4 < 6 </h1><h2> 55 < 66</h2><br/></html>;
      

  13.   

    如果连续两个一样的标签,配对结果不正确
    <html><h1> 4 < 6 </h1><h1> 4 </> 6 </h1></html>;输出:
    1: <html>
    2: <h1> 4 < 6 </h1><h1> 4 </> 6 
    3: </h1>
    4: </html>第一个<h1>匹配了第二个</h1>
      

  14.   

    如果不用正则表达式的话,可以用遍历字符串的方法来解决。不好意思,我是.net平台的。c#程序如下:using System;
    using System.Collections;namespace Test
    {
      class Class1
      {
        static void Main(string[] args)
        {
          String s = "<html><head><title> 333 < 444</title></head><h1> 4 < 6 </h1><h2> 55 < 66</h2><br/></html>";
          int intFirstTabStart = 0;
          int intSecondTabStart = 0;
          IEnumerator strEnum = s.GetEnumerator();      for (int i = 0; i < s.Length; i++)
          {
    strEnum.MoveNext();
    if (strEnum.Current.ToString() == "<") 
    {
      intSecondTabStart = i;
    }
    else
    {
      if (strEnum.Current.ToString() == ">") 
      {
         if (intFirstTabStart != intSecondTabStart) 
         {
    System.Console.WriteLine(s.Substring(intFirstTabStart,(intSecondTabStart - intFirstTabStart)));
         }
         intFirstTabStart = intSecondTabStart;
         intSecondTabStart = i + 1;      if (i == s.Length -1)
                  {
    System.Console.WriteLine(s.Substring(intFirstTabStart,(intSecondTabStart - intFirstTabStart)));
         }
    }
          }
        }

       System.Console.WriteLine();
       System.Console.WriteLine("按 Enter 键继续...");
       System.Console.ReadLine();
    }
    }
    }