[英]Regex to determine if string contains at least 2 numbers
我正在尝试编写一个用户名字段验证器,其中一个要求是该字段必须至少包含 2 个数字(多一点也行,不能少一点)。 我以为我可以做这样的事情,正则表达式在第一个数字上分裂,但从不在第二个数字上分裂。
String[] arr = string.split("[0-9][0-9]");
return arr.length > 2;
用例:Bob11 Bo1b1 11Bob 1Bob1
下面是我的版本,执行速度非常快,可以很容易地更新到不同的标准,并且具有更好的可读性(至少对我而言):
正则表达式(\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 或任何其他数字。 这是一个确保字符串中任意位置不多于不少于 5 个数字的示例: ^(\D*\d){5}\D*$
。 最后一个 \D是必要的,以允许字符串以非数字结尾,如果满足五位数字的标准则验证正则表达式。*
试试这个:
Pattern pattern = Pattern.compile("[0-9].*[0-9]"); Matcher matcher = pattern.matcher(string); if (matcher.find()) { return true; }
[^\d]*\d[^\d]*\d.*
应该是一种方法(有几种..)
我使用[^\d]*
因为.*
是贪婪的,因此可能匹配太多(取决于语言)。 贪婪行为可以通过附加?
: .*?
您可以在https://regex101.com/对其进行测试。
使用正则表达式删除所有非数字字符并计算长度
我正在尝试编写一个用户名字段验证器,其中一个要求是该字段必须包含至少 2 个数字(更多是可以的,只是不能更少)。 我以为我可以做这样的事情,正则表达式在第一个数字上拆分,但从不在第二个数字上拆分。
String[] arr = string.split("[0-9][0-9]");
return arr.length > 2;
用例:Bob11 Bo1b1 11Bob 1Bob1
为此,您不需要 RegEx。 我不确定您使用的是什么语言,但可以安全地假设您的语言中的 String 本质上是一个 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.");
}
这也可能会产生更快的结果。
使用string.match('.*\d.*\d.*');
它将在一个字符串中查找一个数字两次。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.