基于第一个字符的条件正则表达式长度



有一个带有数字的字符串,我需要用 PHP preg_match 进行验证。 如果它以 10、20 或 30 开头,则在最初的 7 个数字之后还需要 2 个数字,但在任何其他情况下,我只需要 8 个数字,并且不在乎主角是什么。 第一部分是简单的/^(1|2|3)0d{7}$

但是如何添加 ELSE 部分?在那里我需要一个简单的

^d{8}$

我需要匹配这些示例:

101234567

201234567

12345678

33445566

您可以使用

^(?:[1-3]0d{7}|(?![1-3]0)d{8})$

查看正则表达式演示

  • ^- 字符串的开头
  • (?:- 非捕获组的开始:
    • [1-3]0d{7}-123,然后0和任意7位数字
    • |- 或
    • (?![1-3]0)d{8}- 不允许在字符串开头立即102030,然后匹配任意 8 位数字
  • )- 组结束
  • $- 字符串的结尾。

以下是使用(?(?=regex)then|else)aka条件的替代方法:

^(?(?=[1-3]0)[1-3]0d{7}|d{8})$

它的字面意思是:如果[1-3]0在开始时是正确的,则匹配[1-3]0d{7},否则匹配d{8}

演示:https://regex101.com/r/LXoHyk/1(例子无耻地取自维克托的答案(

最新更新