2013-04-16 19 views
12

Ich brauche eine Regex, die willkürliche Regex (als String) überprüft, die Anzahl der einfangenden Gruppen zurückgibt. Bisher hat ich ...Regex zum Zählen der Anzahl der einfangenden Gruppen in einer Regex

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

, die für manche Fälle funktioniert, wo die Annahme, dass jede Gruppe, die mit einem Fragezeichen beginnt, ist nicht-Capturing. Es zählt auch leere Gruppen.

Es funktioniert nicht für Klammern in Zeichenklassen oder Escape-Klammern und möglicherweise einige andere Szenarien.

+6

Ein Regex in einer Regex ... [Yo Dawg] (http://memearchive.net/memerial.net/5615/yo-dawg-iherd-you-like-regex.jpg) – Kninnug

Antwort

19

Ändern Sie bitte Ihre regex, so dass es eine leere Zeichenfolge übereinstimmen, dann eine leere Zeichenfolge übereinstimmen und sehen, wie viele Gruppen es gibt:

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

Beispiel: http://jsfiddle.net/EEn6G/

+0

Brilliant Zeug - Ich hätte nie gedacht, es so zu machen! –

+0

+1 Schöne Idee, Andrew. Gute Arbeit. :) – zx81

+0

Kann jemand erklären, wofür die Pipe steht? – Albin

1

Die akzeptierte Antwort ist, was Sie sollten Verwenden Sie in jedem Produktionssystem. Wenn Sie es jedoch aus Spaß mit einer Regex lösen wollten, können Sie das wie unten gezeigt tun. Es nimmt an, dass die Regex die Anzahl der Gruppen in korrekt ist.

Beachten Sie, dass die Anzahl der Gruppen nur die Anzahl der nicht literalen ( s in der Regex ist. Die Strategie, die wir annehmen werden, ist, dass wir nicht alle korrekten ( entsprechen, wir gehen zu split auf alle falschen Sachen zwischen ihnen.

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

Sie können sehen, wie es auf www.debuggex.com funktioniert.

Verwandte Themen