用逗号分隔的正则表达式重复模式
我有以下的正则表达式:
.regex(/^(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{4})$/)
必须完全是4个字符必须包含至少1个数字和1个字母
虽然我很少做正则表达式,但这相对容易。 我现在有一个新的要求,我试图实现,但不能正确。
新要求:能够像以前一样使用逗号分隔的相同类型的输入列表。 不能以逗号结尾。 每个项目必须符合上述规则(4个字符,至少在数字上,至少有一个字母)
Valid: 123F,U6Y7,OOO8
Invalid: Q2R4,
Invalid: Q2R4,1234
Invalid: Q2R4,ABCD
Invalid: Q2R4,N6
我非常感谢你的帮助! 谢谢!
其他一些答案是重复先行的断言。 这没有必要。
这是一个正则表达式,它匹配逗号分隔的原子序列,其中每个原子是四个字母数字字符:
^[A-Z0-9]{4}(?:,[A-Z0-9]{4})*$
当然,这不是你想要的。 你不希望所有字母都是原子。 这里有一个负面的前瞻断言,它可以防止在文本中的任何地方匹配这样一个原子:
(?!.*[A-Z]{4})
而且你不希望原子都是数字:
(?!.*[0-9]{4})
把它放在一起:
^(?!.*[A-Z]{4})(?!.*[0-9]{4})[A-Z0-9]{4}(?:,[A-Z0-9]{4})*$
这个正则表达式应该工作:
^(?:(?![0-9]*,)(?![a-zA-Z]*,)[a-zA-Z0-9]{4},)*(?![0-9]*$)(?![a-zA-Z]*$)[a-zA-Z0-9]{4}$
或者你可以将[0-9]
缩短为d
。 不过,这并不重要,因为扩展后的代码可以更具可读性。
^(?:(?!d*,)(?![a-zA-Z]*,)[a-zA-Zd]{4},)*(?!d*$)(?![a-zA-Z]*$)[a-zA-Zd]{4}$
你可以看到你的正则表达式是如何转换成这个正则表达式的,当我将它排列如下:
^
(?:
(?!d*,)(?![a-zA-Z]*,)[a-zA-Zd]{4},
)*
(?!d*$)(?![a-zA-Z]*$)[a-zA-Zd]{4}
$
尝试使用这个正则表达式(正则表达式测试):
.regex(/^(?:(?![0-9]{4}|[a-zA-Z]{4})[a-zA-Z0-9]{4})(?:(?:b,)(?![0-9]{4}|[a-zA-Z]{4})[a-zA-Z0-9]{4})*$/)
说明:
(?:b,)
- >与之匹配的,
在字符串的开头只有当它由一个单词边界之前
(?:(?![0-9]{4}|[a-zA-Z]{4})[a-zA-Z0-9]{4})
- >匹配字母和数字, 只有当一个字符串没有 4位数字的4个字母
上一篇: Regular Expression Repeating Pattern separated by comma