Регулярное выражение для подсчета количества захваченных групп в регулярном выражении

Мне нужно регулярное выражение, которое проверяет произвольное регулярное выражение (как строку), возвращая количество захваченных групп. Пока у меня есть...

arbitrary_regex.toString().match(/\((|[^?].*?)\)/g).length

Что работает в некоторых случаях, когда предположение о том, что любая группа, начинающаяся с вопросительного знака, не захватывает. Он также учитывает пустые группы.

Он не работает для скобок, включенных в классы символов или экранированные скобки, и, возможно, в некоторых других сценариях.

Ответ 1

Измените свое регулярное выражение так, чтобы оно соответствовало пустой строке, затем сопоставило пустую строку и посмотрело, сколько групп она возвращает:

var num_groups = (new RegExp(regex.toString() + '|')).exec('').length - 1;

Пример: http://jsfiddle.net/EEn6G/

Ответ 2

Принятый ответ - это то, что вы должны использовать в любой производственной системе. Однако, если вы хотите решить это с помощью регулярного выражения для удовольствия, вы можете сделать это, как показано ниже. Он предполагает регулярное выражение, в котором вы хотите, чтобы количество групп было правильным.

Обратите внимание, что количество групп - это просто количество нелитеральных ( в регулярном выражении. Стратегия, которую мы собираемся предпринять, вместо сопоставления всех правильных (, мы собираемся расколоть на все неправильные вещи между ними.

re.toString().split(/(\(\?|\\\[|\[(?:\\\]|.)*?\]|\\\(|[^(])+/g).length - 1

Вы можете увидеть, как он работает на www.debuggex.com.