2015-11-05 112 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