用逗号分隔数据

时间:2011-09-26 15:39:49

标签: java regex split comma

我正在学习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

假设我从表单文本字段中获取上述数据。现在我想只读取数据,这些数据是用逗号分隔的数字

解决方案应为[string]

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

应跳过所有其他数据。 我试过这样的东西^ [0-9] + \,$

但是它也从3.7中选择7,从8.5中选择5等......

任何人都可以帮我解决这个问题!

3 个答案:

答案 0 :(得分:0)

假设您已经在逗号中拆分并尝试检查您获得的元素是否为数字,请使用以下表达式:^\d+(?:\.\d+)?$,这意味着:“必须以数字开头,后跟一个点,至少还有一个数字”。

这将匹配317.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|$)`

开头和结尾的组表示匹配必须跟随输入的开头,逗号或换行符,然后是输入的结尾,逗号或换行符。

答案 1 :(得分:0)

我能提出的最短解决方案是用空字符串替换任何不是逗号分隔的数字。所以你可以s.replaceAll("[^0-9]*,", ",")如果你有随机换行,你可能想要添加s.replaceAll("\n", ",")。然后在这些转换之后,您可以按照建议进行操作并在逗号上拆分。

答案 2 :(得分:0)

此表达式将为您提供所需的所有数字(仅限数字,无逗号)。

"^\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