2016-03-07 19 views
8

我必須使用逗號(,)作爲分隔符分割字符串,忽略任何逗號即內引號(「)
的Java:拆分使用正則表達式

fieldSeparator : ,
fieldGrouper : "

字符串的String斯普利特是:"1","2",3,"4,5"

我能實現它,如下所示:

String record = "\"1\",\"2\",3,\"4,5\""; 
String[] tokens = record.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)"); 

輸出:

"1" 
"2" 
3 
"4,5" 

現在的挑戰是,fieldGrouper(「)不應該是分割標記的一部分。我無法找出這個正則表達式。

分割的預期輸出是:

1 
2 
3 
4,5 
+0

我認爲這樣做炭的炭實際上會更具可讀性並且速度更快。算法非常簡單。處理可能遲早會出現的'''''異常更容易。 – Dariusz

+0

我們可以問您爲什麼使用格式錯誤的僞JSON輸入?引用的時髦性使得這很難處理,並且清理源代碼可能會更好。 –

回答

4

更新:

String[] tokens = record.split("(,*\",*\"*)");

結果:
Image Link

初步解決方案:
(不起作用@.split法)

這RexEx模式將隔離部分你想要的:
(?:\\")(.*?)(?:\\")

它採用非捕獲組隔離對逃過報價, 和一個捕獲組來隔離之間的一切。

看看這裏: Live Demo

+2

這個正則表達式不匹配'3'或任何其他沒有用'「...」'括起來的值。 –

+0

@WiktorStribiżew我更新瞭解決方案,但是在我最初的解決方案中,我假定'##'模式是一致的。我沒有意識到'3'沒有被捕獲,並且仍然懷疑@rvd故意爲'3'設置了不同的格式。無論哪種方式,新的解決方案的作品。 – Enteleform

+0

很抱歉,如果1和2是單獨的數字,您的第二種溶劑將不適用於輸入1,2。 –

0

我的命題:

record = record.replaceAll("\",", "|"); 
record = record.replaceAll(",\\\"", "|"); 
record = record.replaceAll("\"", ""); 

String[] tokens = record.split("\\|"); 

for (String token : tokens) { 
    System.out.println(token); 
} 
2

我的建議:

"([^"]+)"|(?<=,|^)([^,]*) 

regex demo。它將匹配"..."類似的字符串,並只將第1組捕獲到引號之間的內容中,然後匹配並捕獲到字符串開頭或逗號後,以外的第2組字符序列。

這裏是一個Java sample code

String s = "value1,\"1\",\"2\",3,\"4,5\",value2"; 
Pattern pattern = Pattern.compile("\"([^\"]+)\"|(?<=,|^)([^,]*)"); 
Matcher matcher = pattern.matcher(s); 
List<String> res = new ArrayList<String>(); 
while (matcher.find()){      // Run the matcher 
    if (matcher.group(1) != null) {   // If Group 1 matched 
     res.add(matcher.group(1));   // Add it to the resulting array 
    } else { 
     res.add(matcher.group(2));   // Add Group 2 as it got matched 
    } 
} 
System.out.println(res); // => [value1, 1, 2, 3, 4,5, value2] 
+0

更好的建議是,他清理他的源數據恕我直言。 –

1

我會嘗試用這種解決辦法的:

String record = "\"1\",\"2\",3,\"4,5\""; 
record = record.replaceAll("\"?(?<!\"\\w{1,9999}),\"?|\""," "); 
String[] tokens = record.trim().split(" "); 
for(String str : tokens){ 
    System.out.println(str); 
} 

輸出:

1 
2 
3 
4,5 
+0

我最終不得不使用類似的解決方法,即首先拆分,然後從每個令牌中刪除引號(如果存在)。 – rvd