2

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
2
  • 1
    That's because you are using a lookahead that is not supported by Go regexp. Are you after play.golang.org/p/ddjDje0IDig? Commented Feb 27, 2018 at 9:39
  • 3
    Always handle all your errors. Commented Feb 27, 2018 at 10:04

2 Answers 2

4

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 [^/\r\n] since [^/] also matches line breaks.

Sign up to request clarification or add additional context in comments.

Comments

2

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

3 Comments

what are you trying to do?
Distinguish single slash or double slash.
See Wiktors answer

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.