首页 > 解决方案 > 检查正则表达式中捕获组中的最小字符数

问题描述

我对正则表达式有疑问

我只处理数字 0 和 1

我有 10 位数字分为 4 如下

([01]{2})([01]{4})([01]{2})([01]{2})

我需要将所有这些数字与第二组 ([01]{4}) 中的 min 2 1 匹配,无论其他组有多少个 0 或 1。我只对第二组感兴趣

例如,这些是潜在的匹配项

0000110000
0011000000
0001100000
0000110000

我尝试使用积极的前瞻性,例如:

^(\d{2})((?=\d*1{2,}\d*)(\d{4}))(\d{2})(\d{2})

但这甚至是匹配的

0000000011

任何帮助都深表感谢

标签: regexregex-lookarounds

解决方案


如果这些需要是连续的(根据您的示例数据),也许您可​​以使用:

^(?=[01]{2,4}11)[01]{10}$

请参阅在线演示。这里的想法是,您可以将 2-4 个零或 1 匹配到由两个 1 组成的序列。如果您意识到唯一允许的组合在恰好 2-4 个其他数字之后具有最少两个 1(“11”)序列,那么这是有道理的。

  • ^- 开始线锚。
  • (?=[01]{2,4}11)- 打开积极的前瞻,从我们的字符类中查找 2-4 个字符,直到“11”。
  • [01]{10}- 匹配我们角色类中的 10 个字符。
  • $- 结束线锚。

如果需要,您可以更改[01]{10}使用捕获组的部分。


编辑:

如果它们不必是连续的,也许您可​​以使用:

^[01]{2}(?=[01]{8}$)([01]{0,2}1[01]{0,2}1[01]{0,2})[01]{4}$

请参阅在线演示

或者不那么冗长:

^(?=[01]{10}$)(..)(.*1.*1.*)(..)(..)$

查看演示


推荐阅读