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

时间:2014-01-07 04:27:00

标签: regex

我有以下正则表达式:

.regex(/^(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{4})$/)

必须正好是4个字符 必须包含至少1个数字和1个alpha

虽然我很少做正则表达,但这相对容易。我现在有一个新的要求,我试图实现,但无法做到。

新要求:能够拥有与以前相同类型输入的逗号分隔列表。不能以逗号结尾。每个项目必须符合上述规则(4个字符,至少数字,至少一个alpha)

Valid:  123F,U6Y7,OOO8
Invalid:  Q2R4,
Invalid:  Q2R4,1234
Invalid:  Q2R4,ABCD
Invalid:  Q2R4,N6

非常感谢你的帮助! 谢谢!

4 个答案:

答案 0 :(得分:6)

其他一些答案正在重复前瞻断言。这不是必要的。

这是一个匹配逗号分隔的原子序列的正则表达式,其中每个原子是四个字母数字字符:

^[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})*$

答案 1 :(得分:3)

这个正则表达式应该有效:

^(?:(?![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-Z\d]{4},)*(?!\d*$)(?![a-zA-Z]*$)[a-zA-Z\d]{4}$

你可以看到你的正则表达式如何被转换成这个正则表达式,当我按如下方式排列时:

^
(?:
  (?!\d*,)(?![a-zA-Z]*,)[a-zA-Z\d]{4},
)*
  (?!\d*$)(?![a-zA-Z]*$)[a-zA-Z\d]{4}
$

答案 2 :(得分:2)

尝试使用此正则表达式(regex test):

.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\,) - &gt;如果字符串前面有<{>>,则匹配字符串 开头的,

  • (?:(?![0-9]{4}|[a-zA-Z]{4})[a-zA-Z0-9]{4}) - &gt;匹配字母与字母和数字如果有4位数字4个字母

答案 3 :(得分:1)

我希望突出我的答案优势与其他答案进行比较,如下所示:

  • 我的回答直观地编码了“至少一个alpha”和“至少一个数字”的要求 其他答案利用了这样一个事实:考虑到[a-zA-Z0-9]的通用集合,经过一些思考后,这两个要求转化为“并非所有字母而非所有数字”。
  • 在我的回答中,您可以将通用设置更改为您想要的任何内容(即使使用逗号!),也无需为其他要求更改正则表达式。

我的回答:

^(?=.{0,3}\d)(?=.{0,3}[a-zA-Z])[a-zA-Z0-9]{4}(,(?=.{0,3}\d)(?=.{0,3}[a-zA-Z])[a-zA-Z0-9]{4})*$

Regular expression visualization

Debuggex Demo

解释为:

^
  (?=.{0,3}\d)(?=.{0,3}[a-zA-Z])[a-zA-Z0-9]{4}   # Main part
  (,
    (?=.{0,3}\d)(?=.{0,3}[a-zA-Z])[a-zA-Z0-9]{4}
  )*
$

“主要部分”匹配由字母数字([a-zA-Z0-9]{4})组成的任何四个字符,包含至少一个数字((?=.{0,3}\d))和至少一个字母((?=.{0,3}[a-zA-Z]))。然后只需用逗号重复该模式。