匹配单斜线时Golang Regex错误



我写一个模式,它在python中起作用,但是当我在Go 1.9.2中运行时,它会感到恐慌:

panic: runtime error: invalid memory address or nil pointer dereference

代码如下:

package main
import (
    "regexp"
    "fmt"
)

func ReHaveSlash(s string) bool {
    reSlash, _ := regexp.Compile(`^/(?!/)(.*?)`)
    a := reSlash.MatchString(s)
    return a
}
func ReHaveSlashdouble(s string) bool {
    reSlash, _ := regexp.Compile(`^//(.*?)`)
    a := reSlash.MatchString(s)
    return a
}
func main() {
    test_url := "/xmars-assets.qiniu.com/archives/1369"
    fmt.Println(ReHaveSlashdouble(test_url))
    fmt.Println(ReHaveSlash(test_url))
}

和控制台的结果如下

false
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x1095e56]
goroutine 1 [running]:
regexp.(*Regexp).get(0x0, 0x0)
    /usr/local/Cellar/go/1.9.2/libexec/src/regexp/regexp.go:211 +0x26
regexp.(*Regexp).doExecute(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10ee1f5, 0x25, 0x0, 0x0, ...)
    /usr/local/Cellar/go/1.9.2/libexec/src/regexp/exec.go:420 +0x40
regexp.(*Regexp).doMatch(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10ee1f5, 0x25, 0xc42000a0c0)
    /usr/local/Cellar/go/1.9.2/libexec/src/regexp/exec.go:412 +0xc8
regexp.(*Regexp).MatchString(0x0, 0x10ee1f5, 0x25, 0x115f400)
    /usr/local/Cellar/go/1.9.2/libexec/src/regexp/regexp.go:435 +0x6c
main.ReHaveSlash(0x10ee1f5, 0x25, 0x1)
    /Users/l2017006/Documents/work/check-link/test_re.go:12 +0x58
main.main()
    /Users/l2017006/Documents/work/check-link/test_re.go:29 +0xa5

go regexp不支持loughounds。您可以在此处使用否定的角色类,以解决此问题:

package main
import (
    "regexp"
    "fmt"
)
func ReHaveSlash(s string) bool {
    var reSlash = regexp.MustCompile(`^/([^/].*|$)`)
    return reSlash.MatchString(s)
}
func ReHaveSlashdouble(s string) bool {
    var reSlash = regexp.MustCompile(`^//([^/].*|$)`)
    return reSlash.MatchString(s)
}
func main() {
    test_url := "/xmars-assets.qiniu.com/archives/1369"
    fmt.Println(ReHaveSlashdouble(test_url))
    fmt.Println(ReHaveSlash(test_url))
}

请参阅Go Lang Demo

^/([^/].*|$)模式在字符串的开始时与/匹配,然后与/以外的CHAR匹配,然后使用任何0 字符或字符串的末端。^//([^/].*|$)//匹配,然后使用任何0 字符或字符串的结尾

如果要确保仅在同一行上匹配字符串,请用[^/rn]替换[^/],因为[^/]也匹配了线路断裂。

GO REGEX不支持Lookarounds。

这将返回错误,但您会忽略它:

reSlash, _ := regexp.Compile(`^/(?!/)(.*?)`)

错误解析REGEXP:无效或不支持的Perl语法:(?!

使用此服务测试Golang您的正则表达式:https://regex-golang.appspot.com/assets/html/index.html

最新更新