用逗号分隔的正则表达式重复模式

我有以下的正则表达式:

.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个字母

  • 链接地址: http://www.djcxy.com/p/86991.html

    上一篇: Regular Expression Repeating Pattern separated by comma

    下一篇: Regex: how to only allow integers greater than zero