Как вернуть только захваченные группы в JavaScript RegEx с несколькими совпадениями

Упрощенный пример:

/not(?:this|that)(.*?)end/ig.exec('notthis123end notthat45end')

возвращает

["notthis123end", "123"]

Я стреляю за

["123", "45"]

Все, что я выяснил, помещает RE в объект RegExp и запускает цикл while вокруг exec, который кажется каким-то глупым или использует match, но возвращает весь матч, а не только захваченная часть.

Ответ 1

Ваш RegEx работает нормально. Проблема заключается в интерпретации вывода.

  • Чтобы получить несколько совпадений RegEx, вы должны сделать что-то вроде этого

    var regEx = /not(?:this|that)(.*?)end/ig;
    var data  = "notthis123end notthat45end";
    var match = regEx.exec(data);
    
    while(match !== null) {
        console.log(match[1]);
        match = regEx.exec(data);
    }
    

    Примечание. Важно хранить RegEx в переменной, подобной этой, и использовать цикл с этим. Поскольку для получения множественных совпадений реализация JavaScript RegEx сохраняет текущий индекс совпадения в самом объекте RegEx. Итак, в следующий раз exec называется, он поднимается с того места, где он находился. Если мы используем литерал RegEx как есть, то мы закончим бесконечный цикл, так как он будет начинаться с начала всегда.

  • Результат метода exec должен интерпретироваться так: первое значение - это полное совпадение, а следующий элемент мы получаем группы внутри матчей. В этом RegEx у нас есть только одна группа. Итак, мы получаем доступ к этому с помощью match[1].