【问题标题】:Regex quantifier more than one group正则表达式量词多于一组
【发布时间】:2021-07-31 18:57:03
【问题描述】:

我需要一个正则表达式来获取数字 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.

Plus:序列可以是 0 后跟 1,1 的数量越大越好(我不知道是否只有一个正则表达式可能)。 000000001111 -> 应该得到 0001111。

我关注的是 1,然后是 0。

我从[1]+[0]+开始, 在我量化了 0([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}这样的东西?

【问题讨论】:

  • 那么000011110000 呢?你想在这里匹配什么?
  • @JvdV 应该匹配 1111000(大于 1)。

标签: regex regex-group


【解决方案1】:

我尝试使用分支重置组:

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

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

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

【讨论】:

    【解决方案2】:

    看来你只是想要:

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

    这里的{7} 可以替换为最大长度为负一的任何值。

    【讨论】:

    • 这与 000000001111 中的 0001111 不匹配?
    • @JvdV 是的,我可以执行另一个从 0 开始的正则表达式:(?=0+1*$)[01]{7},但是当我输入 000011110000 时,预期的响应应该是 0001111 - 并且正则表达式不匹配。
    • 当我询问这个​​具体案例时,这与您在问题下方的评论不符。
    • @JvdV 应该匹配 0001111 或 1111000,重要的是数字 1 的最大数量。很抱歉让您感到困惑。
    【解决方案3】:

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

    /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)

    【讨论】:

      猜你喜欢
      • 2021-07-25
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 2012-08-11
      • 1970-01-01
      • 2011-08-13
      • 2013-12-05
      • 2012-01-23
      相关资源
      最近更新 更多