Регулярное выражение для подсчета количества захваченных групп в регулярном выражении
Мне нужно регулярное выражение, которое проверяет произвольное регулярное выражение (как строку), возвращая количество захваченных групп. Пока у меня есть...
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.