2011-09-26 171 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