我有以下正则表达式:
.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
非常感谢你的帮助! 谢谢!
答案 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)
我希望突出我的答案优势与其他答案进行比较,如下所示:
[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})*$
解释为:
^
(?=.{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])
)。然后只需用逗号重复该模式。