2011-09-26 215 views
1

我正在學習RegEx。完全是一個新手:P以逗號分隔數據

我想從下面的數據,這是由逗號分隔的分隔數只

test 
t,b 
45,49 
31,34,38,34,56,23,,,,3,23,23653,3875,3.7,8.5,2.5,7.8,2., 6 6 6 6 , 
, 
. 
.,/;,jm.m.,,n ,sdsd, 3,2m54,2 4,2m,ar ,SSD A,,B,4D,CE,S4,D,2343ES,SD 

假設我正在從表單文本字段上面的數據。現在,我想讀哪隻用逗號分隔的數字數據

解決方案應該是[字符串]

45,49,31,34,38,34,56,23,3,23,23653,3875 

所有其他數據應被跳過。 我想是這樣的^ [0-9] + \ $

但它也選擇7 3.7,而5 8.5等.....

誰能幫我解決這個!!

+0

你打算這是一個** **的Java問題或一個**的JavaScript **問題? – Pointy

+1

使用String [] results = secondString.split(「,\\ s *」); //在逗號分割 –

+0

我希望這是Java問題。 – nitin88

回答

0

假設您已經以逗號分隔並嘗試檢查您獲得的元素是否爲數字,請使用以下表達式:^\d+(?:\.\d+)?$,這意味着:「必須以數字後面跟一個點和至少一個多位數字開頭」。

這將匹配31以及7.8,但不2.6 6 6 62m54

下面是由該表達的一部分,說明部分:

  • ^表示:比賽必須在第一個字符
  • $意味着開始:比賽必須在最後的字符結束,所以雙方共同表示整個字符串必須匹配
  • \d+指:一個或多個數字
  • (?: ...)是一個允許應用?量詞非捕獲組
  • \.表示:字面點
  • (?:\.\d+)?從而意味着:後面至少一個數字

編輯點的零次或一個出現次數:如果您只想整數,只是刪除該組:^\d+$ - >整個輸入必須是一個或多個數字。

編輯2: 如果你能前插和逗號追加到輸入字符串 (請參閱編輯4),你應該能夠使用正則表達式得到所有的數字:(?<=,)\s*(\d+(?:\.\d+)?)\s*(?=,)(整數只會要求你刪除(?:\.\d+)?部分)。

該表達式獲取兩個逗號之間的所有數字,逗號和數字之間可能有空格,並將數字捕獲到一個組中。這應防止6 6 6 62m54的匹配。然後只需遍歷這些匹配即可獲得所有組。

編輯3:以下是您輸入字符串的示例。

String input = "test\n" + 
     "t,b\n" + 
     "45,49\n" + 
     "31,34,38,34,56,23,,,,3,23,23653,3875,3.7,8.5,2.5,7.8,2., 6 6 6 6 ,\n" + 
     ",\n" + 
     ".\n" + 
     ".,/;,jm.m.,,n ,sdsd, 3,2m54,2 4,2m,ar ,SSD A,,B,4D,CE,S4,D,2343ES,SD\n"; 

Pattern p = Pattern.compile("(?<=,|\\n)\\s*(\\d+(?:\\.\\d+)?)\\s*(?=,|\\n)");  

Matcher m = p.matcher(input); 

List<String> numbers = new ArrayList<String>(); 

while(m.find()) 
{ 
    numbers.add(m.group(1)); 
} 

System.out.println(Arrays.toString(numbers.toArray())); 

//prints: [45, 49, 31, 34, 38, 34, 56, 23, 3, 23, 23653, 3875, 3.7, 8.5, 2.5, 7.8, 3] 
//removing the faction group: [45, 49, 31, 34, 38, 34, 56, 23, 3, 23, 23653, 3875, 3] 

編輯4:實際上,你並不需要添加逗號,就用這句話:

`(?<=,|\n|^)\s*(\d+)\s*(?=,|\n|$)` 

在開始的團體和結束意味着比賽必須按照輸入的開始,逗號或換行符,然後輸入結尾,逗號或換行符。

+0

我想直接分割數據。首先用「,」分割,然後檢查每個字符串可能是性能開銷!在這種情況下,我嘗試了其他方法(data.trim()。matches(「[0-9 +]」)來匹配分割後的模式。 – nitin88

+0

@ nitin88我添加了一個編輯 – Thomas

+0

感謝您的努力和幫助。你解釋了你是如何寫這個的,我是新手,根據group(1)和?<= \ s * *都對我有點困惑 – nitin88

0

我可以想出的最短的解決方案是將任何不是用逗號分隔的數字替換爲空字符串。所以你可以這樣做s.replaceAll("[^0-9]*,", ",")如果你有隨機的換行符,你可能會想要添加一個s.replaceAll("\n", ",")。然後,在這些轉換之後,您可以按照建議進行操作並以逗號分割。

0

這個experssion會給你你需要的所有數字(只有數字,沒有逗號)。

"^\d+|(?<=,)\d+$|(?<=,)\d+(?=,)" 

看到grep的例子:

kent$ echo "31,34,38,34,56,23,,,,3,23,23653,3875,3.7,8.5,2.5,7.8,2., 6 6 6 6 , 
"|grep -oP "^\d+|(?<=,)\d+$|(?<=,)\d+(?=,)" 

31 
34 
38 
34 
56 
23 
3 
23 
23653 
3875 
+0

但是,如果數據包含「34ES」它會得到「34」,但它應該被忽略,只有逗號分隔的數字必須被讀取,而所有其他組合必須被忽略。 – nitin88