匹配单斜杠时出现golang regex错误

I write a pattern and it works in Python, but when I run in Go 1.9.2, it panics:

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

The code as follows:

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))

}

And the result in Console is as following

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 does not support lookarounds. You may use a negated character class with an alternation group here to fix the issue:

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))
}

See the Go lang demo

The ^/([^/].*|$) pattern matches a / at the start of the string, and then matches a char other than / followed with any 0+ chars or end of string. The ^//([^/].*|$) matches // followed with any 0+ chars or end of string

If you want to make sure you only match strings on the same line, replace [^/] with [^/ ] since [^/] also matches line breaks.

Go regex does not support lookarounds.

This will return an error, but you ignore it:

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

error parsing regexp: invalid or unsupported Perl syntax: (?!

Use this service to test Golang your regular expressions: https://regex-golang.appspot.com/assets/html/index.html