2016-10-19 88 views
3

我得到了一些用逗號分隔的數據,但我需要逗號「」之間的數字來分隔數據。所以:「A,B」應該是「A,B」,而A,B應該分成「A」,「B」。無法讓我的正則表達式正常工作

我遇到的麻煩是,如果在行中有幾個逗號符號,那麼空白點將被忽略:A ,, B分裂爲「A」,「B」 但我需要它:「 A」,‘’,‘B’

這是我的代碼:

ArrayList<String> tokens = new ArrayList<String>(); 
String regex = "\"([^\"]*)\"|([^,]+)"; 
Matcher m = Pattern.compile(regex).matcher(line); 
while (m.find()) { 
    if (m.group(1) != null) { 
     tokens.add(m.group(1)); 
    } 
    else { 
     tokens.add(m.group(2)); 
    } 
} 

,第一組工作,但我不能,因爲我需要第二個工作是:([^,] +)(除了一次或幾次以外的任何事情) 也不包括空字符串。這甚至可能嗎?

+0

查看http://regexr.com/以測試正常表達納秒。這很好 –

+0

@anubhava謝謝,我試過了:'String regex =「\」([^ \「] *)\」|([^,] *)「;'它增加了很多空字符串 – suziz

回答

2

你只需要添加另一個分支到你的替代:(?<=,)(?=,)匹配兩個逗號之間的空白空間。

String line = "A,,B"; 
ArrayList<String> tokens = new ArrayList<String>(); 
String regex = "\"([^\"]*)\"|[^,]+|(?<=,)(?=,)"; // <= No need for Group 2 
Matcher m = Pattern.compile(regex).matcher(line); 
while (m.find()) { 
    if (m.group(1) != null) { 
     tokens.add(m.group(1)); 
    } 
    else { 
     tokens.add(m.group(0)); // <= Note that we can grab the whole match here 
    } 
} 
System.out.println(tokens); 

online Java demo

+0

謝謝很多,這就解決了我的問題 – suziz

0

看起來像你只需要更換+*並添加雙引號你的第二個捕獲組:

\"([^\"]*)\"|([^",]*(?!$)) 

檢查它是如何工作here

+0

完全在https://regex101.com/r/M0XbwA/1,很顯然,這個正則表達式不起作用,因爲它提取了除''以外的字符組成的塊的末尾的空值。 –

+0

謝謝。更正。希望我正確理解您的通知。 – NikitOn

相關問題