php - 正则表达式:如果第二组到位,则忽略条件
问题描述
和往常一样,我无法欺骗我的大脑来完全理解正则表达式。现在,我正在尝试创建带有条件的正则表达式,例如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 请求验证(服务器端);
解决方案
您的模式匹配太多的原因是因为这部分{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 位数字
)
关闭非捕获组$
字符串结束
如果连字符后的位数应为 5:
^(?:\d{6}-\d{5}|\d{8}|\d{11}|\d{13})$
推荐阅读
- python - 按给定索引处的元素对列表中的元组进行排序和访问
- typescript - 有趣的行为:对象字面量只能指定已知属性
- c# - 我如何获得消息中提到的 Discord 成员并授予他角色?
- python - 在 for 循环中迭代 Python 中 Seaborn kdeplot 中的颜色
- javascript - 编写不和谐机器人时的权限问题
- javascript - React:如何仅渲染可见元素
- php - 如何将与 php 中的 html 表单中的字符串相同的图像发送到服务器或作为对 API 的请求
- android - 在颤振中使用流生成器时,我不断收到轻微的空错误
- javascript - 如何将不可点击的纯文本 URL 转换为 HTML 源中的链接
- javascript - 编写高尔夫代码比基本代码更干净