有限长度的条件正则表达式php

时间:2016-04-23 12:24:29

标签: php regex conditional

我正在尝试设置正则表达式验证,但有一个条件通过,不应该。好像我错过了什么。对正则表达式和我想要验证的内容进行了研究。感谢您的帮助。

我的正则表达式:

~^(?=([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

2 个答案:

答案 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])/