]> Cypherpunks repositories - gostls13.git/commitdiff
regexp: add HasMeta and regexp.Expr().
authorRob Pike <r@golang.org>
Fri, 17 Dec 2010 00:55:26 +0000 (16:55 -0800)
committerRob Pike <r@golang.org>
Fri, 17 Dec 2010 00:55:26 +0000 (16:55 -0800)
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

src/pkg/regexp/all_test.go
src/pkg/regexp/find_test.go
src/pkg/regexp/regexp.go

index d5a0e7da6ad705872e13542a690e30b6bc274e77..5b614de1631e0ac3a7c4af075148300f633a7589 100644 (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 {
        input    string
        expected int
index 07f5586f2b3870f6927913ea82fad0c72144c907..27c5a54f79d834f1f19c25660e693a4d4b420de9 100644 (file)
@@ -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
index 1728c7ec26de0858d77694dd52273071bba55c6b..74572383c87578cedcb91f33513e668029effc00 100644 (file)
@@ -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