mirror of
https://github.com/golang/go
synced 2024-11-22 03:34:40 -07:00
regexp: allow escaping of any punctuation
More in line with other regexp packages and egrep; accommodates overzealous escapers. R=r CC=golang-dev https://golang.org/cl/1008041
This commit is contained in:
parent
43409ed2c6
commit
6f33f34bbc
@ -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 {
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user