需要匹配的字符串:"   入局局向  安庆关口         安庆S1240       "
正则表达式:"\s+入局局向\s{2}(\S+\s+)*"因为正则表达式中包含*,所以可以循环匹配"安庆关口"和"安庆S1240",但是我想用group把它们分别取出来:
group(0)毫无疑义:   入局局向  安庆关口         安庆S1240       
group(1)是循环匹配的最后一个:"安庆S1240"
group(2)异常
我想请教各位高手,有什么方法可以把"安庆关口"和"安庆S1240"用分组的方式都取出来.谢谢~~~

解决方案 »

  1.   

    你上面的正则表达式只匹配了 "安庆s1240",所以 只能打印出一个group试试这个,
    String str="   入局局向  安庆关口         安庆S1240       ";
    String pat="\\s+入局局向\\s+(.*?)\\s+(.*?)\\s+";
    Matcher m=Pattern.compile(pat).matcher(str);
    while(m.find()){
      System.out.println(m.group(0));
      System.out.println(m.group(1));
      System.out.println(m.group(2));
    }
      

  2.   

    谢谢楼上的回复,您误解我的意思了:我是用"*"循环匹配"安庆关口"和"安庆S1240"的,我想如果有"*"的话,如何用group把所有匹配的分别取出来?
      

  3.   

    个人理解; 你的(\S+\s+)*  首先匹配到 "安庆关口", 放到group(0)里,但接着又匹配到 
    安庆S1240 ,因此又把前面匹配的覆盖掉了,所以最后 group(0)里只有 "安庆S1240"用这个  String pat="\\s+安庆关口\\s{2}(\\S+\\s+)(\\S+\\s+)";
    试下,你就知道了,
      

  4.   

    ***********
    谢谢您的回复!
    我明白您的编程意思,但是我必须在正则表达式中使用"*",或许正像您说的每一次匹配把以前的内容覆盖掉了,所以我想问问有没有什么办法把中间结果记录下来.
    也就是说,是用"*"循环匹配"安庆关口"和"安庆S1240"的,如何用group把所有匹配的分别取出来?
      

  5.   

    group(int i):
    当i=0,表示整个匹配串;
    当i>0,表示匹配到的第i的串。lz的意思是不是字串中含有*这个字符,那你加上转义符就可以了\\*
      

  6.   

    把你的目标写出来吧,或许你的匹配内容有多个字符串,所以才用循环,如果中间只是空格(或者分割符比较规范)的话,用split()就可以了把那些字符串分割开了,
      

  7.   

    正则表达式:(\s+入局局向)\s{2}(\S+\s+)(\S+\s+)
    结果:Group0:   入局局向  安庆关口         安庆S1240       
          Group1:   入局局向
          Group2:安庆关口         
          Group3:安庆S1240       
    一个括号代表一个Group~~~~~~~