用逗号分隔数据
Posted
技术标签:
【中文标题】用逗号分隔数据【英文标题】:Separate Data by Comma 【发布时间】:2011-09-26 15:39:49 【问题描述】:我正在学习正则表达式。完全是一个新手: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]+\,$
但它也是从 3.7 中选择 7,从 8.5 中选择 5,等等......
谁能帮我解决这个问题!
【问题讨论】:
您打算将其作为 Java 问题还是 javascript 问题? 使用 String[] results = secondString.split( ",\\s*" ); // 用逗号分割 我希望这是 Java 问题。 【参考方案1】:假设您已经以逗号分隔并尝试检查您获得的元素是否是数字,请使用此表达式:^\d+(?:\.\d+)?$
,这意味着:“必须以数字开头,可能后跟一个点,并且至少还有一个数字” .
这将匹配 31
和 7.8
,但不匹配 2.
、6 6 6 6
或 2m54
。
下面是对该表达式的部分解释:
^
表示:匹配必须从第一个字符开始
$
表示:匹配必须在最后一个字符结束,所以两者一起意味着整个字符串必须匹配
\d+
表示:一位或多位数字
(?: ... )
是一个非捕获组,允许应用 ?
量词
\.
表示:文字点
(?:\.\d+)?
因此意味着:一个点出现零次或一次,后跟至少一位数字
编辑:如果您只想要整数,只需删除组:^\d+$
-> 整个输入必须是一位或多位数字。
编辑 2:如果您可以在输入字符串前添加逗号(请参阅编辑 4),您应该能够使用此正则表达式来获取所有数字:(?<=,)\s*(\d+(?:\.\d+)?)\s*(?=,)
(仅限整数将要求您删除 (?:\.\d+)?
部分)。
该表达式获取两个逗号之间的所有数字,逗号和数字之间可能有空格,并将数字捕获到一个组中。这应该防止匹配6 6 6 6
或2m54
。然后只需遍历匹配项以获取所有组。
编辑 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|$)`
开头和结尾的组表示匹配必须跟在输入的开头(逗号或换行符)之后,然后是输入的结尾(逗号或换行符)。
【讨论】:
我想直接拆分数据。首先用“,”分割,然后检查每个字符串可能是性能开销!在这种情况下,我尝试了其他方法(data.trim().matches("[0-9+]") 在拆分后匹配模式。 感谢您的努力和帮助。你能解释一下你是怎么写这个的吗?我是新手。按 group(1) 和 ? @nitin88group(1)
由 JavaDoc 记录在该方法上。它指出组 0 将是整个匹配项(包括空格),因此如果您在表达式中使用捕获组,它们将从 1 开始。(?<=...)
和 (?=...)
是零宽度正向查看前组。有关这些的文档,请查看regular-expressions.info【参考方案2】:
我能想到的最短解决方案是用空字符串替换不是由逗号分隔的一组数字的任何内容。所以你可以做s.replaceAll("[^0-9]*,", ",")
如果你有随机换行符,你可能想要添加s.replaceAll("\n", ",")
。然后在这些转换之后,您可以按照建议进行操作并用逗号分隔。
【讨论】:
【参考方案3】:此表达式将为您提供所需的所有数字(只有数字,没有逗号)。
"^\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
【讨论】:
但如果数据包含“34ES”,它将得到“34”。但它应该被忽视。只能读取以逗号分隔的数字,并且必须忽略所有其他组合。以上是关于用逗号分隔数据的主要内容,如果未能解决你的问题,请参考以下文章