字符串String input = "aabbbccdddef"
求一个正则表达式可以分割成数组'aa','bbb,'cc,'ddd,'e,'f'
之前我写的正则表达式是:String input = "aabbbccdddef";
String regex = "(?<!^)(?=(.)\\1+)";
String[] arr = input.split(regex);达不到效果,还有谁能提供下正则表达式

解决方案 »

  1.   

    正则能做到么?没有分隔符也,如果是我,只能借助循环+hashMap了。
      

  2.   

        String input = "aabbbccdddef";
        String regex = "(.)(?!\\1|$)";
        String temp = input.replaceAll(regex, "$1,");
        String[] arr = temp.split(",");
        System.out.println(Arrays.toString(arr));
      

  3.   


    Matcher m=Pattern.compile("(\\w)\\1*").matcher("aabbbccdddef");
    while(m.find())
    System.out.println(m.group());
      

  4.   

    将所有与后面内容不一致的字符(除了最后一个)后面,添加一个逗号(可能需要考虑其他转义),然后再split直接split应该不行。因为split的正则中需要匹配,才能到你工作分隔符,因此,(?...)系列的lookahead/behind,就不行。同时split本身会把这些分隔符吃掉。
      

  5.   

    或者写个函数: public static String[] getStringArray(String str){
    char[] chs=str.toCharArray();
    int cnt=chs.length;
    List<String> strList=new ArrayList<String>();
    StringBuffer sb=new StringBuffer();
    for(int i=0;i<cnt-1;i++){
    sb.append(chs[i]);
    if(chs[i]!=chs[i+1]){
    strList.add(sb.toString());
    sb.setLength(0);
    }
    if(i==cnt-2){
    sb.append(chs[i+1]);
    strList.add(sb.toString());
    }
    }

    int size=strList.size();
    String[] strs=new String[size];
    for(int i=0;i<size;i++){
    strs[i]=strList.get(i);
    }

    return strs;
    }

    public static void main(String[] args) {
    String input = "aabbbccdddef";
    System.out.println(Arrays.toString(getStringArray(input) ));
    }
      

  6.   

    向职位牛人学习!String input = "aabbbccdddef";
    String regex = "((.)+?)(?!\\2)";
    String temp = input.replaceAll(regex, "$1,");
    String[] arr = temp.split(",");
    System.out.println(java.util.Arrays.toString(arr));
      

  7.   

    这的确是个好思路。String regex = "(?<!^)(?=(.)\\1+)";
    但是,用这种regex,String input = "aabbbccdddef"
    会分割成'aa','bb','cc','d','d','ddef'.
    因为,用(?...)系列的,是用'空隙'来匹配的,所以我觉得不会把input里
    的单字给吃掉。
    我觉着,这个正则regex应该可以直接写出来,可是我没那水平啊。
    哈哈,不知道,我说清楚了没有。
    谢谢5楼的思路。
      

  8.   

    lz对lookbehind, lookahead理解错了,它可以用来测试匹配前后的内容,但是本身不算作匹配。而split需要匹配
      

  9.   

    #3楼 得分:0回复于:2010-05-25 17:21:39Java code    String input = "aabbbccdddef";
        String regex = "(.)(?!\\1|$)";
        String temp = input.replaceAll(regex, "$1,");
        String[] arr = temp.split(",");
        System.out.println(Arrays.toString(arr));
     
    这个答案不错
     
      

  10.   

    但是曾看过,一哥么回的贴子里就有,根据大写字母来split的,
    用的也是(?!......) (?=......)。 private static void main(String[] args) {
    String input = "ADogIsEatingPork";
    String regex = "(?<!^)(?=[A-Z])";
    String[] s = input.split(regex); for (int i = 0; i < s.length; i++) {
    System.out.println(s[i]);
    }
    }这个输出结果就是A
    Dog
    Is
    Eating
    Pork
      

  11.   

    意思就是,
    1.环视的话,不能是动态的值?
    2.我的思路是,某个空隙处 (|代表空隙),
    .....(Y)|(X)\1
    即后面的值要和前面的内容一致(所以用\1反向亦农),
    但同时确保,空隙前面的值(即Y值)和X值又要不同。
    所以写了如下思路的一个表达式(不能实现功能)
    (?<!^)(?=(.)\\1+)(?<!\\1)
    这样确保String input = "aabbbccdddef"
    可以分割成数组'aa','bbb,'cc,'ddd,'e,'f'。
    不知道,我这个思路对不对?
      

  12.   

    必须要有匹配(match),才能split,同时split会把匹配的东西去除而光有环视本身并不匹配任何东西
      

  13.   

    24L中,举的例子,用来split的就是大写字母前的"空隙"啊。
      

  14.   


    String str = "aabbbccdddef";
    String arr[] = str.split("(?<=(\\w))(?!\\1)");
    System.out.println(java.util.Arrays.toString(arr));今天忽然发现,貌似这样也可以