mirror of
https://github.com/golang/go
synced 2024-11-21 22:04:39 -07:00
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
This commit is contained in:
parent
b266f39b85
commit
e1033d07b4
@ -454,6 +454,34 @@ func TestAllMatches(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
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()
|
||||
|
@ -677,6 +677,9 @@ func MustCompile(str string) *Regexp {
|
||||
return regexp
|
||||
}
|
||||
|
||||
// NumSubexp returns the number of parenthesized subexpressions in this Regexp.
|
||||
func (re *Regexp) NumSubexp() int { return re.nbra }
|
||||
|
||||
// The match arena allows us to reduce the garbage generated by tossing
|
||||
// match vectors away as we execute. Matches are ref counted and returned
|
||||
// to a free list when no longer active. Increases a simple benchmark by 22X.
|
||||
|
Loading…
Reference in New Issue
Block a user