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

有限长度的条件正则表达式php,php,regex,conditional,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之后添加了一个字符,则该字符不应通过

我试图设置正则表达式验证,但有一个条件是通过的,不应该通过。好像我错过了什么。下面是正则表达式和我要验证的内容。谢谢你在这方面的帮助

我的正则表达式:

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

我想你把这件事复杂化了

您希望匹配两个相似的模式。你可以做聪明的向后看/向后看之类的事情,但在这种特殊情况下,你想要的是通过单独匹配模式更容易解决:

/(?:[a-z]{2}\d{6})|(?:[a-z]\d{6}[a-z])/

我认为你把这件事复杂化了

您希望匹配两个相似的模式。你可以做聪明的向后看/向后看之类的事情,但在这种特殊情况下,你想要的是通过单独匹配模式更容易解决:

/(?:[a-z]{2}\d{6})|(?:[a-z]\d{6}[a-z])/

当您需要用正则表达式匹配多个字符时,您应该使用限制量词——您确实这样做了。但是,当需要**将长度限制为匹配的N个字符时,应该使用零宽度断言

由于您的问题是匹配整个字符串,因此需要锚定:
^
$
(字符串末尾)。验证时,我建议使用
\A
而不是
^
\z
(仅在字符串末尾匹配)而不是
$
(可能在最后一个换行之前匹配)

注意,您不需要条件表达式,您需要分组

图案详情:

  • \A
    -字符串锚的开始
  • [a-z]
    -小写字母
  • (?:[a-z]\d{6}|\d{6}[a-z])
    -两种选择之一:
    • [a-z]
      -小写字母
    • \d{6}
      -六位数字

    • \d{6}
      -六位数字
    • [a-z]
      -小写字母
  • \z
    -字符串结尾

当您需要将多个字符与正则表达式匹配时,您应该使用限制量词-您确实这样做了。但是,当需要**将长度限制为匹配的N个字符时,应该使用零宽度断言

由于您的问题是匹配整个字符串,因此需要锚定:
^
$
(字符串末尾)。验证时,我建议使用
\A
而不是
^
\z
(仅在字符串末尾匹配)而不是
$
(可能在最后一个换行之前匹配)

注意,您不需要条件表达式,您需要分组

图案详情:

  • \A
    -字符串锚的开始
  • [a-z]
    -小写字母
  • (?:[a-z]\d{6}|\d{6}[a-z])
    -两种选择之一:
    • [a-z]
      -小写字母
    • \d{6}
      -六位数字

    • \d{6}
      -六位数字
    • [a-z]
      -小写字母
  • \z
    -字符串结尾

  • (a-z{{0-9}[0-9}[0-9}[0-9}[0-9}[6}{{{{6}}}40<<<<<
使用:<<<<<<<<<<<<<使用:<<<<<<<<<<<<<<<<<<<<<<<使用.....使用...使用.使用::<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<使用......使用....使用.使用.使用.使用.使用.使用..使用..使用::::::::::::::::::{1}$。您使用的锚不正确使用
^([a-z]{2}\d{6}|[a-z]\d{6}[a-z])有什么问题$
?还有一件事:-字符需要在第一位还是最后一位?使用::)使用::)使用::)使用::)使用:::)使用:::)使用:::)使用:::)使用::::)使用::::)使用::::::::::::::::::::)如果不是(如果不是这个案件,那么你regex,你regex是错误的,你regex是错误的,谢谢,谢谢,谢谢,谢谢,谢谢,你你你你你你你的regex是错误,你你的regex是错误,谢谢,谢谢,谢谢,谢谢,谢谢,谢谢,谢谢,谢谢,谢谢,谢谢,谢谢,谢谢,谢谢,谢谢,谢谢,谢谢,谢谢,321321321321321321321321787878787878787878787878787878787,第二一,第二个,第二个是错误,第二个是错误,第二个是错误,第二个是错误,第二个是错误,第二个是错误,第二个是错误,第二个1}[0-9]{6}[a-z]{1})$。您错误地使用了定位点使用
^([a-z]{2}\d{6}|[a-z]\d{6}[a-z])有什么问题吗$
?还有一件事:-字符需要在第一位还是最后一位?因为如果不是这样的话,那么你的正则表达式是错误的谢谢rock321987第二个非常好用。谢谢Sverri,上面的一些评论解决了我的问题。我离它很近。谢谢你的模式是错误的,因为它没有锚定。@Casimirithippolyte然后锚定它。谢谢Sverri,上面的一些评论解决了我的问题。我离它很近。谢谢你的模式是错误的,因为它没有被锚定。@Casimirithippolyte然后锚定它。谢谢Wiktor的帮助和详细解释。非常有帮助。我想补充一点,在这种情况下分组并不是必要的。从OP的正则表达式中去掉所有不需要的垃圾后,唯一的问题是它在第二个分支中缺少一个起始锚点(
^
)。感谢Wiktor的帮助和详细解释。非常有帮助。我想补充一点,在这种情况下分组并不是必要的。从OP的正则表达式中去掉所有不需要的垃圾后,唯一真正错误的是第二个分支中缺少了起始锚点(
^
)。