mirror of
https://github.com/golang/go
synced 2024-11-21 21:14:47 -07:00
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:
parent
be45ba712b
commit
5bd4094d2e
@ -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 {
|
||||
input string
|
||||
expected int
|
||||
|
@ -119,7 +119,11 @@ func build(n int, x ...int) [][]int {
|
||||
|
||||
func TestFind(t *testing.T) {
|
||||
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 {
|
||||
case len(test.matches) == 0 && len(result) == 0:
|
||||
// ok
|
||||
|
@ -599,6 +599,11 @@ Loop:
|
||||
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
|
||||
// object that can be used to match against text.
|
||||
func Compile(str string) (regexp *Regexp, error os.Error) {
|
||||
@ -998,6 +1003,18 @@ func QuoteMeta(s string) string {
|
||||
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.
|
||||
func (re *Regexp) allMatches(s string, b []byte, n int, deliver func([]int)) {
|
||||
var end int
|
||||
|
Loading…
Reference in New Issue
Block a user