首页 > 解决方案 > 正则表达式:如果第二组到位,则忽略条件

问题描述

和往常一样,我无法欺骗我的大脑来完全理解正则表达式。现在,我正在尝试创建带有条件的正则表达式,例如if second group matches then change the character quantity.

这是一组应该匹配正则表达式的值:

123456-12345
12345678901
12345678
1312345678912

但是如果有第二组(“-”之后),第一组的数字或字符必须正好是 6,如果没有第二组,第一组的最小字符数必须是 == 8 或 == 11 OR = 13,所以这些不应该匹配:

12345-12345 // 5 + 5 chars
1234567-12345 // 7 + 5 chars
123456 // 6 chars
12345678901234 // >13 chars
1234567890 // 10 chars
123456789088 // 12 chars

到目前为止,这是我想出的:

([0-9]{6,})(-?)(([0-9]{5})?)+

这将符合大部分要求,但也接受禁止的版本,例如:

123456789-12345
1111111111111111111

主要问题是如何有条件地区分组并根据组是否存在限制最大字符数?

亲切的问候,

PS 是的,这意味着用于 PHP 请求验证(服务器端);

标签: phpregex

解决方案


您的模式匹配太多的原因是因为这部分{6,}匹配 6 个或更多数字,这将首先匹配所有 6 个或更多连续数字。

然后这部分匹配一个可选的连字符-?,最后一组(([0-9]{5})?)+重复 1 次或多次。但该组匹配 5 个可选数字。

因为除了第一个之外的所有量词都是可选的,它可以匹配大多数示例字符串。


您可以匹配 6 位数字、连字符后跟 1 位以上的数字,或在量词中带有设定数字的其他变体{n}

^(?:\d{6}-\d+|\d{8}|\d{11}|\d{13})$
  • ^字符串的开始
  • (?:非捕获组
    • \d{6}-\d+匹配 6 位-和 1 位以上的数字
    • |或者
    • \d{8}|\d{11}|\d{13}匹配 8 位或 11 位或 13 位数字
  • )关闭非捕获组
  • $字符串结束

正则表达式演示| PHP 演示

如果连字符后的位数应为 5:

^(?:\d{6}-\d{5}|\d{8}|\d{11}|\d{13})$

推荐阅读