代码之家  ›  专栏  ›  技术社区  ›  Hoang Hong Khang

捕获量词

  •  -1
  • Hoang Hong Khang  · 技术社区  · 10 年前

    我有一个正则表达式模式来捕获三个组:

    (([abc])([abc])([abc]))
    

    我怎样才能用另一种方式重写它?

    我尝试了:

    (([abc]){1,3})
    

    但只有最后一组被抓获。

    提前感谢。

    2 回复  |  直到 10 年前
        1
  •  1
  •   riroo    10 年前

    如果我明白你的意思,你想把“abc”作为一个整体。例如 abcabcabc 而不是 abcabbc . 如果是这样的话,那么你应该使用 (abc){1,3} 看见 https://regex101.com/r/kX8aB7/3

        2
  •  0
  •   asontu    10 年前

    除非您使用某些正则表达式引擎(我相信.net支持它),否则无法以不同的方式执行此操作。如果重复一个捕获组,重复的匹配将覆盖该捕获组先前找到的匹配。这就是为什么你最后只赢了最后一场比赛。

    如果您不知道将出现多少子模式的实例,但希望在捕获组中捕获子模式的每个单独匹配,这当然是一个限制。

    根据(编程)环境,解决这一问题的一种方法是将重复的模式匹配为一个更大的捕获组,然后在找到的捕获上运行一个新的正则表达式。例子:

    var inp = 'some string that matches regex & ac but we don\'t know how many letters after the regex';
    
    var m = inp.match(/(regex).*?([abc]{1,3})/);
              
    document.getElementById('out').value=m[2].match(/[abc]/g).join('\n');
    <textarea id="out" rows="5" style="width:100%"></textarea>