【问题标题】:Regex capture optional groups正则表达式捕获可选组
【发布时间】:2022-11-21 04:22:16
【问题描述】:

我正在尝试捕获 2 组数字,其中每组都是可选的,并且只有在包含数字时才应捕获。这是它应该匹配的所有有效组合的列表:

  1. 123(456)
  2. 123
  3. (456)
  4. abc(456)
  5. 123(efg)

    这些不是有效的组合,应该不是匹配:

    1. abc(efg)
    2. abc
    3. (efg)

    但是,我的正则表达式在 #4#5 组合上失败,即使它们包含数字。

    const list = ["123(456)", "123", "(456)", "abc(456)", "123(def)", "abc(def)", "abc", "(def)"];
    const regex = /^(?:(\d+))?(?:\((\d+)\))?$/;
    
    list.map((a,i) => console.log(i+1+". ", a + "=>".padStart(11-a.length," "), (a.match(regex)||[]).slice(1).toString()));
    .as-console-wrapper{top:0;max-height:unset!important;overflow:auto!important;}

    所以,问题是为什么在一组后面使用 ? 时,如果没有匹配,它不会“跳过”该组?

    附言 使用此正则表达式,它还捕获 #4,但不捕获 #5/(?:^|(\d+)?)(?:\((\d+)\))?$/

【问题讨论】:

    标签: javascript regex regex-group


    【解决方案1】:

    可以使用 lookahead 来解决您正在寻找的问题,请参阅:

    ^.*(?=^d+(?:(|$)).*|.*(?=(d+)).*$
    

    粗略的翻译:从开头以括号(或行尾)结尾的数字或文本某处括号中的数字

    回答有关可选捕获组的问题

    是的,如果一个组被标记为可选,例如(A*)? 它确实使整个组成为可选的。 在你的情况下,这只是正则表达式不匹配的情况 - 即使可选部分不存在(在正则表达式调试器的帮助下验证)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-15
      • 1970-01-01
      相关资源
      最近更新 更多