2015-11-05 110 views
5

分割无限制分割整个字符串,但是如果您设置了限制,则会向左分割该限制。我怎么能这样做的权利?如何分割一个字符串,并在java中右边开始?

"a.b.c".split("[.]", 2); // returns ["a", "b.c"] 

我想

"a.b.c".splitRight("[.]", 2); // to return ["a.b", "c"] 

编辑:我想是的作品就像splited但颠倒过来,我添加了一个更复杂的例子一个通用的解决方案

我想

"a(->)b(->)c(->)d".splitRight("\\(->\\)", 3); // to return ["a(->)b", "c", "d"] 
+2

倒过来:) – blank

+0

@blank:D有趣的解决方案,但那里有太多的计算工作,如果分隔符不是一个单独的字符,我将不得不扭转它... – aalku

+0

太多的计算?我们有这种东西的电脑!但是它确实变得更加复杂了 – blank

回答

1

我会尝试像这样的东西:

public List<String> splitRight(String string, String regex, int limit) { 
    List<String> result = new ArrayList<String>(); 
    String[] temp = new String[0]; 
    for(int i = 1; i < limit; i++) { 
     if(string.matches(".*"+regex+".*")) { 
      temp = string.split(modifyRegex(regex)); 
      result.add(temp[1]); 
      string = temp[0]; 
     } 
    } 
    if(temp.length>0) { 
     result.add(temp[0]); 
    } 
    Collections.reverse(result); 
    return result; 
} 

public String modifyRegex(String regex){ 
    return regex + "(?!.*" + regex + ".*$)"; 
} 

分离用正则表达式是由另一个包裹,所以对于\\.,您将获得:\\.(?!.*\\..*$),以配合和最后一次出现分裂分隔符。这个字符串被这个正则表达式多次分割,结果数组的第二个元素被添加到List中,下一个分割在结果数组的第一个元素上完成。

以上方法对您的示例字符串的影响与预期的一样。

5

您可以使用预见匹配:

"a.b.c".split("[.](?=[^.]*$)") 

在这里你说:“我想分裂只有点后面没有其他点”。

如果您想通过最近的N点分裂,你可以概括这个(更丑陋的方式)这种解决方案:

"dfsga.sdgdsb.dsgc.dsgsdfg.dsdg.sdfg.sdf".split("[.](?=([^.]*[.]){0,3}[^.]*$)"); 

更换3N-2

但是我会写,而不是一个短期的静态方法:

public static String[] splitAtLastDot(String s) { 
    int pos = s.lastIndexOf('.'); 
    if(pos == -1) 
     return new String[] {s}; 
    return new String[] {s.substring(0, pos), s.substring(pos+1)}; 
} 
+0

好的解决方案,如果限制是2.任何变种,以使其成为一个参数?我不介意在正则表达式字符串中包含像'{2}'这样的一些想法。正则表达式专用于该分隔符。适应任何分离器并不容易。谢谢 – aalku

+0

我只是做了'splitAtLastDot',但我想知道是否有一个通用的解决方案,而不仅仅是限制2的情况。 – aalku

+1

我闻到递归 – px5x2

2

尽管你说的倒会采取长,here's小PROGRAMM那尊字符串,并通过限制将其分解;

static String[] leftSplit(String input, String regex, int limit) { 
    String reveresedInput = new StringBuilder(input).reverse().toString(); 
    String[] output = reveresedInput.split(regex, limit); 
    String tempOutput[] = new String[output.length]; 
    for(int i = 0;i<output.length;++i) { 
     tempOutput[tempOutput.length-i-1] = new StringBuilder(output[i]).reverse().toString(); 
    } 
    return tempOutput; 
} 

public static void main(String[] args) { 
    System.out.println(Arrays.toString(leftSplit("a.b.c", "[.]", 2))); 
    System.out.println(Arrays.toString(leftSplit("I want to. Split this. by the. right side", "[.]", 2))); 
} 
+1

如果正则表达式像'' - >“'一样是定向的,你不能总是颠倒正则表达式。 – aalku

+1

是的,这不会在更复杂的正则表达式上工作,但对于更简单的正则表达式,这应该工作。为了使它适用于复杂的正则表达式,你将不得不扭转正则表达式。 – SomeJavaGuy