2011-06-16 57 views
35

由於String.split()作品正則表達式,這個片段:String.split()* not * on regular expression?

String s = "str?str?argh"; 
s.split("r?"); 

...產量:[, s, t, , ?, s, t, , ?, a, , g, h]

什麼是使其產生[st, st, argh]r?順序拆分此字符串最優雅的方式?

編輯:我知道我可以逃避有問題的?。麻煩是我不知道定界符,我不想編寫escapeGenericRegex()函數來解決這個問題。

回答

57

的一般解僅僅使用的Java SE的API是:

String separator = ... 
s.split(Pattern.quote(separator)); 

quote方法返回一個正則表達式,將參數字符串字面匹配。

5

逃離?

s.split("r\\?"); 
+1

一個更通用的解決方案被要求 – dvhh 2011-06-17 07:59:32

+4

@dvhh我的答案被賦予_before_編輯。 – 2011-06-17 13:59:27

9

您可以使用

StringUtils.split("?r") 

commons-lang

+1

StringUtils.split()應該比String.split()快得多,因爲StringUtils.split使用線性掃描分隔符,而String.split()使用正則表達式,這非常慢 – 2017-02-15 19:11:00

-3

嘗試

String s = "str?str?argh"; 
s.split("r\?"); 
+2

不太可能因爲缺少而工作反斜槓。 – 2011-06-16 15:09:49

+1

添加另一個反斜槓,它會起作用。 – 2011-06-16 15:28:20

2

使用Guava Splitter

提取物的非重疊子串從輸入字符串,通常通過識別分離器序列的外觀。此分隔符可以指定爲單個字符,固定字符串,正則表達式或CharMatcher實例。或者,根本不使用分隔符,分隔符可以提取給定固定長度的相鄰子字符串。

3

這完美的作品還有:

public static List<String> splitNonRegex(String input, String delim) 
{ 
    List<String> l = new ArrayList<String>(); 
    int offset = 0; 

    while (true) 
    { 
     int index = input.indexOf(delim, offset); 
     if (index == -1) 
     { 
      l.add(input.substring(offset)); 
      return l; 
     } else 
     { 
      l.add(input.substring(offset, index)); 
      offset = (index + delim.length()); 
     } 
    } 
} 
+0

此解決方案的性能不理想,因爲它會創建臨時子字符串。 – BladeCoder 2014-05-20 09:30:50

+1

@BladeCoder:你說得對。我修好了:)(當我寫這個,我一定是16,我猜) – 2014-05-20 10:44:37

+0

確實好多了:) – BladeCoder 2014-05-20 21:25:16

4
String[] strs = str.split(Pattern.quote("r?"));