我正在尝试设置正则表达式验证,但有一个条件通过,不应该。好像我错过了什么。对正则表达式和我想要验证的内容进行了研究。感谢您的帮助。
我的正则表达式:
~^(?=([a-z]{2}))[a-z]{2}[0-9]{6}$|(?=([a-z]{1}))[a-z]{1}[0-9]{6}[a-z]{1}$~i
应该验证的数据(两个字符加6个字符或字符加6个数字加一个字符):
AB123456
A123456B
不应验证的数据。我的问题是如果在有效的AB123456之后添加了一个字符,它就不应该通过。
AB123456A
A123456AB
答案 0 :(得分:2)
当你需要使用正则表达式匹配多个字符时,你应该使用限制量词 - 你做到了。但是,当您需要将长度限制为匹配的N个字符时,应使用零宽度断言。
由于您的问题与整个字符串匹配,因此需要锚点:^
和$
(字符串结尾)。在验证时,我宁愿推荐\A
而不是^
和\z
(仅匹配字符串末尾)而不是$
(可能在之前匹配)最后一个换行符。)
请注意,您不需要条件表达式,需要分组。
/\A[a-z](?:[a-z]\d{6}|\d{6}[a-z])\z/
模式细节:
\A
- 字符串锚的开始[a-z]
- 小写字母(?:[a-z]\d{6}|\d{6}[a-z])
- 两种选择中的任何一种:
[a-z]
- 小写字母\d{6}
- 六位数
\d{6}
- 六位数字[a-z]
- 小写字母\z
- 字符串结束。答案 1 :(得分:0)
我认为你这很复杂。
您想要匹配两个相似的模式。你可以做一些聪明的后视/前进和类似的东西,但是你想要的只是通过简单地分别匹配模式来解决这个问题:
/(?:[a-z]{2}\d{6})|(?:[a-z]\d{6}[a-z])/