2011-06-16 32 views
35

String.split() yana eserleri, bu pasajı:Normal ifadede String.split() * değil *? Düzenli ifadeler ile

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

... verimleri: [, s, t, , ?, s, t, , ?, a, , g, h]

o [st, st, argh] üretir, böylece r? dizisi bu dize bölmek en zarif yolu nedir?

EDIT: Sorunlu ?'dan kurtulabileceğimi biliyorum. Sorun, sınırlayıcıyı bilmiyorum ve bunu bir escapeGenericRegex() işlevini yazarak çalışmam gibi hissetmiyorum.

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

cevap

57

genel çözüm deneyin:

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

quote yöntem bir hazır olarak dizgeyi eşleşecek bir normal ifade döndürür.

5
? Escape

.

+1

daha genel bir çözüm Benim cevabım düzenlemek _before_ verildi @dvhh – dvhh

+4

istendi. –

9

Sen commons-lang den

StringUtils.split("?r") 

kullanabilirsiniz:

+1

StringUtils.split, ayırıcı için doğrusal tarama kullanıyor, String.split() ise regex kullanıyor, gerçekten yavaş olan –

-3

sadece Java SE API'leri olduğunu kullanılarak

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

Eksik olması nedeniyle çalışmaya olanaksız olduğu için StringUtils.split() öğesi String.split() yönteminden çok daha hızlı olmalıdır. Ters eğik çizgi. –

+1

Başka bir ters eğik çizgi ekleyin ve işe yarayacak. –

2

kullanımı Guava Splitter: tipik olarak bir ayırıcı dizisinin görünüşe tanıyarak bir giriş dizisinden

ekstreleri üst üste binmeyen altdizgelerin. Bu ayırıcı, tek bir karakter, sabit dize, normal ifade veya CharMatcher örneği olarak belirtilebilir. Veya, bir ayırıcı kullanmak yerine, bir dağıtıcı belirli bir sabit uzunluğun bitişik alt dizilerini çıkarabilir.

3

Bu mükemmel olarak iyi çalışır:

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

Bu çözümün performansı, geçici alt dizeler oluşturduğundan ideal değildir. – BladeCoder

+1

@BladeCoder: Haklısınız. Ben düzeltdim :) (Bunu yazdığımda, 16 olmalıydım, sanırım) –

+0

Çok daha iyi :) – BladeCoder

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