Add query to find number of subexpressions.
This was convenient for me to have without being forced
to parse the regexp myself. I'd understand if it's not
really wanted, but I also think that some meta information
about compiled regexps would be fine.
R=r, rsc
CC=golang-dev
https://golang.org/cl/183044
diff --git a/src/pkg/regexp/all_test.go b/src/pkg/regexp/all_test.go
index 0c27413..05bba73 100644
--- a/src/pkg/regexp/all_test.go
+++ b/src/pkg/regexp/all_test.go
@@ -454,6 +454,34 @@
}
}
+type numSubexpCase struct {
+ input string
+ expected int
+}
+
+var numSubexpCases = []numSubexpCase{
+ numSubexpCase{``, 0},
+ numSubexpCase{`.*`, 0},
+ numSubexpCase{`abba`, 0},
+ numSubexpCase{`ab(b)a`, 1},
+ numSubexpCase{`ab(.*)a`, 1},
+ numSubexpCase{`(.*)ab(.*)a`, 2},
+ numSubexpCase{`(.*)(ab)(.*)a`, 3},
+ numSubexpCase{`(.*)((a)b)(.*)a`, 4},
+ numSubexpCase{`(.*)(\(ab)(.*)a`, 3},
+ numSubexpCase{`(.*)(\(a\)b)(.*)a`, 3},
+}
+
+func TestNumSubexp(t *testing.T) {
+ for _, c := range numSubexpCases {
+ re, _ := Compile(c.input)
+ n := re.NumSubexp()
+ if n != c.expected {
+ t.Errorf("NumSubexp for %q returned %d, expected %d", c.input, n, c.expected)
+ }
+ }
+}
+
func BenchmarkLiteral(b *testing.B) {
x := strings.Repeat("x", 50)
b.StopTimer()