regexp: add HasMeta and regexp.Expr().

The former is a boolean function to test whether a string
contains a regular expression metacharacter; the second
returns the string used to compile the regexp.

R=gri, rsc
CC=golang-dev
https://golang.org/cl/3728041
This commit is contained in:
Rob Pike 2010-12-16 16:55:26 -08:00
parent be45ba712b
commit 5bd4094d2e
3 changed files with 34 additions and 1 deletions

View File

@ -269,6 +269,18 @@ func TestQuoteMeta(t *testing.T) {
} }
} }
func TestHasMeta(t *testing.T) {
for _, tc := range quoteMetaTests {
// HasMeta should be false if QuoteMeta returns the original string;
// true otherwise.
quoted := QuoteMeta(tc.pattern)
if HasMeta(tc.pattern) != (quoted != tc.pattern) {
t.Errorf("HasMeta(`%s`) = %t; want %t",
tc.pattern, HasMeta(tc.pattern), quoted != tc.pattern)
}
}
}
type numSubexpCase struct { type numSubexpCase struct {
input string input string
expected int expected int

View File

@ -119,7 +119,11 @@ func build(n int, x ...int) [][]int {
func TestFind(t *testing.T) { func TestFind(t *testing.T) {
for _, test := range findTests { for _, test := range findTests {
result := MustCompile(test.pat).Find([]byte(test.text)) re := MustCompile(test.pat)
if re.Expr() != test.pat {
t.Errorf("Expr() = `%s`; should be `%s`", re.Expr(), test.pat)
}
result := re.Find([]byte(test.text))
switch { switch {
case len(test.matches) == 0 && len(result) == 0: case len(test.matches) == 0 && len(result) == 0:
// ok // ok

View File

@ -599,6 +599,11 @@ Loop:
re.prefix = string(b) re.prefix = string(b)
} }
// Expr returns the source text used to compile the regular expression.
func (re *Regexp) Expr() string {
return re.expr
}
// Compile parses a regular expression and returns, if successful, a Regexp // Compile parses a regular expression and returns, if successful, a Regexp
// object that can be used to match against text. // object that can be used to match against text.
func Compile(str string) (regexp *Regexp, error os.Error) { func Compile(str string) (regexp *Regexp, error os.Error) {
@ -998,6 +1003,18 @@ func QuoteMeta(s string) string {
return string(b[0:j]) return string(b[0:j])
} }
// HasMeta returns a boolean indicating whether the string contains
// any regular expression metacharacters.
func HasMeta(s string) bool {
// A byte loop is correct because all metacharacters are ASCII.
for i := 0; i < len(s); i++ {
if special(int(s[i])) {
return true
}
}
return false
}
// Find matches in slice b if b is non-nil, otherwise find matches in string s. // Find matches in slice b if b is non-nil, otherwise find matches in string s.
func (re *Regexp) allMatches(s string, b []byte, n int, deliver func([]int)) { func (re *Regexp) allMatches(s string, b []byte, n int, deliver func([]int)) {
var end int var end int