我有一个字符串,我需要相匹配。这意味着它应该只包含一个数字,后跟空间,或只是一个数和最小数应始终为1。对于例如:
3 1 2
1 p 3
6 3 2
0 3 2
第一和第三个是有效的字符串和所有其他的都没有。
我想出了下面的正则表达式,但我不知道我怎么能检查最小数量在该字符串应该是1始终?
str.matches("(\\d|\\s)+")
正则表达式从here使用
只是\\d
取代[1-9]
。
\\d
只是该类[0-9]
的简写。
这是一个更好的正则表达式,但:([1-9]\\s)*[1-9]$
,因为它需要照顾的两位数的问题,不会让空间在最后。
并非一切都可以或应该用正则表达式来解决。
你可以使用一个简单的语句,比如
str.matches("((\\d+)\\s)+")
什么都简单地检查你的输入行包含的数字后面是一个或多个空格只组。
如果匹配,你前进的空间,并为每个组数字你把它变成一个号码和验证对有效范围划分。
我有一种感觉:正则表达式实际上是不够的,你需要的那种验证。
正则表达式是解决方案的一部分。但我不认为单靠正则表达式可以解决你的问题。
这是我提出的解决方案:
private static boolean isValid(String str) {
Pattern pattern = Pattern.compile("[(\\d+)\\s]+");
Matcher matcher = pattern.matcher(str);
return matcher.matches() && Arrays.stream(Arrays.stream(matcher.group().split(" "))
.mapToInt(Integer::parseInt)
.toArray()).min().getAsInt() == 1;
}
要注意的匹配类型:matcher.matches() - 检查对阵整个输入。 (不使用matcher.find() - 因为它不会拒绝无效输入诸如“1个P 2”)
如果它应该只包含一个数字,后跟空间或只是一个数字和最小数量应为1和数目也可以大于10,你可以使用:
^[1-9]\\d*(?: [1-9]\\d*)*$
需要注意的是,如果你想只匹配,而不是使用\s
这matches more你可能只是在模式中添加空间的空间。
说明
^
断言字符串的开始[1-9]\\d*
匹配从1的数(?: [1-9]\\d*)*
从1重复一些了一个前置的空间$
断言结束