在字母数字字符 JavaScript 正则表达式中的任何位置最多允许 2 位数字



我正在尝试验证 js 中的用户字符串,其中允许用户输入字母数字字符,但有一些限制。限制是,在该字母数字字符内,用户只能在字母数字范围内的任何地方使用2位数字(相同或不同(。 几个例子是:

1aabdjc2jfd

1klajdfjkladf2

35klfjaddf

fadsfadsf23

fadf2lkdjaf3fdf

dfdf1kjdkf1等等

知道如何使用 JS 正则表达式完成此操作吗?

因此,您要查找的是一个字母字符串,其中最多包含两位数。

/^[a-zA-Z]*(?:d[a-zA-Z]*){0,2}$/

第一个[a-zA-Z]*与初始字母部分(如果有(匹配。

d[a-zA-Z]*匹配一个数字,后跟 0 个或多个字母字符。将其包装在{0,2}中是总共最多允许两位数的原因。

如果最多不是两位数,而是您要查找的正好两位数,只需将{0,2}替换为{2}

/^[a-zA-Z]*(?:d[a-zA-Z]*){2}$/

您可以使用String#match方法来准确找出字符串包含多少位数:

var regex = /d/g;
function valid(string) {
return string.match(regex).length <= 2;
}
var strings = [
'1aabdjc2jfd',
'1klajdfjkladf2',
'35klfjaddf',
'fadsfadsf23',
'fadf2lkdjaf3fdf',
'dfdf1kjdkf1',
'dfd2f1kjdk1f1',
'df21212d2f1kjdk1f1',
'dfd2f1kjdk434341f1'
];
strings.forEach(str => console.log(str, valid(str)));

这里的一种选择是只使用否定的前瞻断言,该断言检查三个或更多数字是否彼此相邻。 这是我建议的模式:

^(?!.*[0-9]{3,})[A-Za-z0-9]*$

代码示例:

console.log(/^(?!.*[0-9]{3,})[A-Za-z0-9]*$/.test('1klajdfjkladf2'));
console.log(/^(?!.*[0-9]{3,})[A-Za-z0-9]*$/.test('1klajdfjkladf2333'));

如果我误解了您的要求,而是检查只有两个数字出现,当数字出现时,那么有一个更简单的模式:

^(?:[A-Za-z]*(?:[0-9]{2})?)*$

演示

最新更新