我有一个需要匹配的字符串。意味着它只能包含一个数字,后跟空格,或者仅是一个数字,最小数字应始终为1。例如:
3 1 2
1 p 3
6 3 2
0 3 2
第一个和第三个是有效字符串,其他所有都不是
我想出了以下正则表达式,但是我不确定如何检查该字符串中的最小数字应始终为1?
str.matches("(\\d|\\s)+")
here中使用的正则表达式
答案 0 :(得分:1)
只需将error[E0433]: failed to resolve: maybe a missing extern crate crates;? --> src\types.rs:17:5 | 17 | use crates::chrono::{DateTime, NaiveDate, Utc}; | ^^^^^^ maybe a missing extern crate crates;?
替换为\\d
。
[1-9]
只是\\d
类的简写。
这是一个更好的正则表达式:[0-9]
,因为它可以解决两位数的问题,并且不允许在末尾留空格。
答案 1 :(得分:0)
不是所有问题都可以或应该用正则表达式解决。
您可以使用一个简单的表达式,例如
str.matches("((\\d+)\\s)+")
或类似的东西可以简单地检查您的输入行是否仅包含数字组,后跟一个或多个空格。
如果匹配,则沿空格分开,对于每组数字,将其转换为数字并针对有效范围进行验证。
我有一种直觉,即正则表达式实际上不足以进行所需的验证。
答案 2 :(得分:0)
正则表达式是解决方案的一部分。但是我不认为正则表达式可以单独解决您的问题。
这是我建议的解决方案:
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”)
答案 3 :(得分:0)
如果它只包含一个数字,然后是空格,或者一个数字,并且最小数字应为1,并且数字也可以大于10,则可以使用:
^[1-9]\\d*(?: [1-9]\\d*)*$
请注意,如果您只想匹配一个空格,则可以不使用matches more中的\s
,而只需在模式中添加一个空格。
说明
^
断言字符串的开头[1-9]\\d*
匹配一个从1开始的数字(?: [1-9]\\d*)*
从1开始重复一个数字,并加一个前置空格$
声明字符串的结尾