一组以上的正则表达式量词

Regex quantifier more than one group

我需要一个正则表达式来获取数字 1 后跟数字 0 的序列,并且总数应等于最大长度。有没有办法做类似 (([1]+)([0]+)){maxLength} 的事情?

例如: 最大长度 = 7

10 -> should not pass (total length < maxLength)
1111100 -> should match
1000000 -> should match
11110000000 -> should match 1111000.
111111111111 -> should match 1111111.

加:顺序可以是0后跟1,1的个数越大越好(不知道只用一个regex行不行)。 000000001111 -> 应该得到 0001111。

我先关注 1,然后关注 0。

我从 [1]+[0]+ 开始, 在我量化 0s ([1]+)([0]{1,7}) 之后, 但它仍然给出比我想要的更多的 0。

然后我在想 ([1]{7,}|[1]{6}[0]{1}|[1]{5}[0]{2}|[1]{4}[0]{3}|[1]{3}[0]{4}|[1]{2}[0]{5}|[1]{1}[0]{6}), 好的,它有效。但是,如果 maxLength = 100,则上述解决方案不可行。

有什么方法可以计算第一个匹配组的长度,然后计算第二个匹配组与第一个匹配组的长度差吗?

或者类似 (([1]+)([0]+)){7} 的东西?

看来你只是想要:

^(?:(?=1+0*$)|(?=0+1*$))[01]{7}

这里的{7}可以替换为最大长度减一的任意值

我尝试使用分支重置组:

0*(?|(1[10]{6})|([10]{6}1))

在线查看demo。您可以使用第一个捕获组的结果。

  • 0* - 0+ 文字零(贪婪)直到;
  • (?| - 打开分支重置组:
    • (1[10]{6}) - 第一个捕获组包含文字 1 和 6 个 1 或 0。
    • | - 或者:
    • ([10]{6}1) - 第一个捕获组最多包含 6 个 1 或 0 和一个字面上的 1。
    • ) - 关闭分支重置组。

我认为正则表达式可以像这样简单:

/0*([01]{7})/

示例:

const result = `
10
1111100
1000000
11110000000
111111111111
000000001111
`.split("\n").reduce((acc, str) => {
  const m = str.match(/0*([01]{7})/);
  m && acc.push(m[1]);
  return acc
}, []);

console.log(result)