public static void main(String[] args) {
    String str = "aaa<内层数据1>bbbbbb《内层数据2》ccc<伪装内层数据》ddd";
    System.out.println(str);
    Pattern p = Pattern.compile("(<)?(《)?([^<>《》]+)(?(1)>)?(?(2)》)?");//这样会出错
    //Pattern p = Pattern.compile("[<《]([^<>《》]+)[>》]");//这个会抓出伪装内层数据
    //Pattern p = Pattern.compile("<([^<>《》]+)>|《([^<>《》]+)》");//这种曲线目标方式可以实现但不是用的条件匹配
    Matcher m = p.matcher(str);
    while (m.find()) {
      System.out.println(m.group(0));
    }
  }我的需求是希望匹配出 内层数据1 和内层数据2
看了关于正则条件匹配的资料 (?(id/name)yes-pattern | no-pattern) 这种但是试了很久也没能正确写出正则表达式。
这里请教各位一下,有对条件匹配比较熟悉的朋友么,希望能指点指点,谢谢了!

解决方案 »

  1.   

    str = "aaa<内层数据1>bbbbbb《内层数据2》ccc<伪装内层数据》ddd";
    System.out.println(str);
    regex = "[^<]*<([^>]*)>*[^《]*《([^》]*)》";
    Pattern p = Pattern.compile(regex);//
    Matcher m = p.matcher(str);
    while (m.find()) {
    System.out.println(m.group(1));
    System.out.println(m.group(2));
    }
      

  2.   

    嗯,谢谢楼上的朋友。我就是想把条件匹配搞醒火。曲线的写法我试过了,现在就是想用(?(id/name)y|n)形式来实现,可是一直没写成功。
      

  3.   

    呵呵,我也试了下,好像不行,java可能不支持。
      

  4.   

    我也在考虑这个问题   java 支持吗 
      

  5.   

    是哦。有可能是不支持呢。上次看到递归的平衡组匹配方式,看了最后发现java没有这个功能。
    等看看有没有了解的朋友来帮给个定论或者指点下用法上的问题。
    谢谢楼上几位~
      

  6.   

    .NET中支持这一语法,Java中是不支持的string str = "aaa<内层数据1>bbbbbb《内层数据2》ccc<伪装内层数据》ddd";
    //Regex reg = new Regex(@"(<(?<o>)|《(?<p>))[^<>《》]*(?(o)>|(?(p)》))");
    Regex reg = new Regex(@"(?:(<)|(《))[^<>《》]*(?(1)>|(?(2)》))");
    MatchCollection mc = reg.Matches(str);
    foreach (Match m in mc)
    {
         richTextBox2.Text += m.Value + "\n";
    }
    /*------输出------
    <内层数据1>
    《内层数据2》
    */当然,这一需求并不是非要用条件判断语法的
    String test = "aaa<内层数据1>bbbbbb《内层数据2》ccc<伪装内层数据》ddd";
    String pattern = "<[^<>]*>|《[^《》]*》";
    Matcher m = Pattern.compile(pattern).matcher(test);
    while(m.find())
    {
    System.out.println( m.group());
    }
    /*------输出------
    <内层数据1>
    《内层数据2》
    */
      

  7.   

    这个这样不行吗:import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class TextNested {
    public static void main(String[] args) {
              
    String str="aaa<内层数据1>bbbbbb《内层数据2》ccc<伪装内层数据》ddd";
    Matcher m1=Pattern.compile("(?:(?<=[<])(?:.*?)(?=[>]))|(?:(?<=[《])(?:.*?)(?=[》]))").matcher(str);
    while(m1.find()) {
    System.out.println(m1.group());
    }
    }}测试结果:内层数据1
    内层数据2
      

  8.   

    谢谢8楼的朋友,原来java对这个功能不支持,这下搞明白了。
    谢谢9楼,不过  xx|xx 这种思路的正则并不是我想要的,这里我就是想用条件匹配来实现。 
      

  9.   

    看到你的留言了,你自己测试下。        String str = "aaa<内层数据1>bbbbbb《内层数据2》ccc<伪装内层数据》ddd";
            System.out.println(str);
            Pattern p = Pattern.compile("(?<=\\<)[\\u4e00-\\u9fa50-9]+(?=\\>)|(?<=《)[\\u4e00-\\u9fa50-9]+(?=》)");
            Matcher m = p.matcher(str);
            while (m.find()) {
              System.out.println(m.group());
            }
      

  10.   

    谢谢楼上的热心,看来java对正则的支持缺少条件匹配这个功能咯。
    上次是平衡组,这次是条件匹配,希望下一版jdk能支持吧。
    刚试了php的,php的都支持条件匹配,哦哦$str ="aaa<内层数据1>bbbbbb《内层数据2》ccc<伪装内层数据》dd";
    $arr = array();
    preg_match_all("#(?:(<)|(《))([^<>《》]+)(?(1)>)(?(2)》)#",$str,$arr);
    print_r($arr[0]);挂一会,看还有哪些朋友能一起讨论下。然后就结贴了
      

  11.   

    你那个也是用到了或的关系。其实道理也是一样的。
    如果java正则支持动态编译的话。想.net中的表达式树一样。
    那么你可以把[<《]匹配的结果\1然后通过一个map转化成相对的>或者》。这样可能就会很强大了。
      

  12.   

    哦,这个有机会一定要研究下。没有涉及过.net,但感觉.net对正则的支持做得很全面,平衡组也是只有.net支持吧(果子兄如是说)。
      

  13.   


    我昨天也想到  用反向引用来实现 但是不知道如何 通过\1 把 < 转化成 >不知道 哪位大侠能实现啊
      

  14.   

    长沙本来就小,IT人圈子不活跃。技术交流,广交朋友
    限长沙上班IT族 群号 124617549
      

  15.   

    perl有嵌套组,C++则在boost::rgex里支持嵌套组,在boost::xpressive库里支持自引用/递归。功能和C#的平衡组相当。
    java的regex库目前还起来弱了。