]> Cypherpunks repositories - gostls13.git/commitdiff
regexp: allow escaping of any punctuation
authorRuss Cox <rsc@golang.org>
Mon, 26 Apr 2010 17:00:18 +0000 (10:00 -0700)
committerRuss Cox <rsc@golang.org>
Mon, 26 Apr 2010 17:00:18 +0000 (10:00 -0700)
More in line with other regexp packages
and egrep; accommodates overzealous escapers.

R=r
CC=golang-dev
https://golang.org/cl/1008041

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

index c1f6795e721068aed48a2bd316fe539dc01112cf..62dad3aa016e4bbd51c26c464265bad4b4c2415b 100644 (file)
@@ -28,6 +28,7 @@ var good_re = []string{
        `[abc]`,
        `[^1234]`,
        `[^\n]`,
+       `\!\\`,
 }
 
 type stringError struct {
@@ -100,6 +101,14 @@ var matches = []tester{
        // fixed bugs
        tester{`ab$`, "cab", vec{1, 3}},
        tester{`axxb$`, "axxcb", vec{}},
+
+       // can backslash-escape any punctuation
+       tester{`\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\{\|\}\~`,
+               `!"#$%&'()*+,-./:;<=>?@[\]^_{|}~`, vec{0, 31}},
+       tester{`[\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\{\|\}\~]+`,
+               `!"#$%&'()*+,-./:;<=>?@[\]^_{|}~`, vec{0, 31}},
+       tester{"\\`", "`", vec{0, 1}},
+       tester{"[\\`]+", "`", vec{0, 1}},
 }
 
 func compileTest(t *testing.T, expr string, error os.Error) *Regexp {
index f8d03d743f0604d27b7132638effead318f5d359..cdd5cacdda2130e40644e3d7f95ac1c7248d439d 100644 (file)
@@ -298,8 +298,8 @@ func special(c int) bool {
        return false
 }
 
-func specialcclass(c int) bool {
-       for _, r := range `\-[]` {
+func ispunct(c int) bool {
+       for _, r := range "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~" {
                if c == r {
                        return true
                }
@@ -344,7 +344,7 @@ func (p *parser) charClass() instr {
                                p.error(ErrExtraneousBackslash)
                        case c == 'n':
                                c = '\n'
-                       case specialcclass(c):
+                       case ispunct(c):
                                // c is as delivered
                        default:
                                p.error(ErrBadBackslash)
@@ -439,7 +439,7 @@ func (p *parser) term() (start, end instr) {
                        p.error(ErrExtraneousBackslash)
                case c == 'n':
                        c = '\n'
-               case special(c):
+               case ispunct(c):
                        // c is as delivered
                default:
                        p.error(ErrBadBackslash)