我正在尝试编写一个用户名字段验证器,其中一个要求是该字段必须包含至少2个数字(更多是好的,不能少)。我以为我可以做这样的事情,正则表达式在第一个数字上分裂,但从不在第二个数字上。
String[] arr = string.split("[0-9][0-9]");
return arr.length > 2;
用例: Bob11 Bo1b1 11Bob 1Bob1
答案 0 :(得分:1)
下面是我的版本,具有极高的执行速度,可以轻松地更新为不同的标准,并且具有更好的可读性(至少对我而言):
正则表达式
(\D*\d){2,}
示例
Bob11 - Match
Bo1b1 - Match
11Bob - Match
1Bob1 - Match
11235 - Match
Bobb - Does NOT Match
Bob1 - Does NOT Match
Bo1b - Does NOT Match
1Bob - Does NOT Match
说明
\D
-非数字。
*
-(量词)零次或多次。
\d
-一位。
(\D*\d)
-将以上组合封装为一个组。
{2,}
-(量化符)可确保该组至少出现2次,并且可以出现更多次。
(\D*\d){2,}
-因此,\D*
个非数字零或无限次,后跟一个\d
数字,此组合重复了{2,}
两个或无限次。
更新为不同条件
可以包含^
(开始字符串锚)和$
(结束字符串锚)以确保限制,以防准则更改为精确2或任何其他数字的情况。
此示例确保在字符串^(\D*\d){5}\D*$
中的任何地方不超过5个数字。 最后一个\ D 是必要的,以允许字符串以非数字结尾,如果满足五位数字的条件,则验证正则表达式。*
答案 1 :(得分:0)
试试这个:
Pattern pattern = Pattern.compile("[0-9].*[0-9]");
Matcher matcher = pattern.matcher(string);
if (matcher.find()) {
return true;
}
中查看正则表达式
答案 2 :(得分:0)
[^\d]*\d[^\d]*\d.*
应该是一种方法(有几种......)
我使用[^\d]*
因为.*
贪婪,因此可能匹配太多(取决于语言)。可以通过附加?
:.*?
您可以在https://regex101.com/进行测试。
答案 3 :(得分:-1)
使用string.match(‘.*\d.*\d.*’);
它会在字符串中查找两位数字。
答案 4 :(得分:-1)
您可以像here所描述的那样执行此操作。
String pattern= "^(?=.*?\\d.*\\d)[a-zA-Z0-9]{3,}$";
return string.matches(pattern);
答案 5 :(得分:-1)
您不需要RegEx。我不确定您使用的语言是什么,但可以安全地假设您所用语言的字符串本质上是Char数组。如果是这种情况,则获取Char数组中的数字字符数,并比较它是否大于1.
例如,这是一个C#示例:
String username = Console.ReadLine();
if (username.Count(c => Char.IsDigit(c)) > 1) {
Console.WriteLine("The String contains 2 or more digits.");
} else {
Console.WriteLine("The String did not contain 2 or more digits.");
}
这也可能会产生更快的结果。
答案 6 :(得分:-1)
使用正则表达式删除所有非数字字符并计算长度