假设您已经以逗号分隔并尝试检查您获得的元素是否是数字,请使用此表达式:^\d+(?:\.\d+)?$
,这意味着:“必须以数字开头,可能后跟一个点和至少一个数字”。
这将匹配31
以及7.8
,但不匹配2.
,6 6 6 6
或2m54
。
以下是对该表达式的部分解释:
^
意思是:匹配必须从第一个字符开始
$
意思是:匹配必须在最后一个字符结束,所以两者一起意味着整个字符串必须匹配
\d+
表示:一位或多位数字
(?: ... )
?
是允许应用量词的非捕获组
\.
意思是:字面上的点
(?:\.\d+)?
因此意味着:一个点出现 0 次或 1 次,后跟至少一个数字
编辑:如果您只想要整数,只需删除组:^\d+$
-> 整个输入必须是一位或多位数字。
编辑 2:如果您可以在输入字符串前面加上逗号(请参阅编辑 4),您应该能够使用此正则表达式来获取所有数字:((?<=,)\s*(\d+(?:\.\d+)?)\s*(?=,)
仅整数需要您删除该(?:\.\d+)?
部分)。
该表达式获取两个逗号之间的所有数字,逗号和数字之间可能有空格,并将数字捕获到一个组中。这应该防止匹配6 6 6 6
or 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|$)`
开头和结尾的组意味着匹配必须跟在输入的开头(逗号或换行符)之后,然后是输入的结尾(逗号或换行符)。