我尝试编写一个用户名字段验证器,其中一个要求是该字段必须包含至少 2 个数字(多一点也可以,不能少一点)。我想我可以做这样的事情,正则表达式在第一个数字上分裂,但从不在第二个数字上分裂。
String[] arr = string.split("[0-9][0-9]");
return arr.length > 2;
Run Code Online (Sandbox Code Playgroud)
使用案例: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
Run Code Online (Sandbox Code Playgroud)
解释
\D- 非数字。
*-(量词)零次或多次。
\d- 一位数。
(\D*\d)- 将上面的组合封装为一个组。
{2,}-(量词)确保该组至少出现 2 次,并且能够出现更多次。
(\D*\d){2,}- 因此,\D*非数字零次或无限次,后跟一个\d数字,该组合重复{2,}两次或无限次。
更新到不同的标准
可以包括
(^起始字符串锚点)和$(结束字符串锚点)以确保限制,以防标准更改为精确的 2 或任何其他数字。这是一个确保字符串中任意位置的数字不多不少于 5 个的示例:^(\D*\d){5}\D*$。最后一个 \D是允许字符串以非数字结尾所必需的,如果满足五位数字的标准,则验证正则表达式。*