首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匹配单斜杠时的金刚正则表达式误差

问匹配单斜杠时的金刚正则表达式误差
EN

Stack Overflow用户
提问于 2018-02-27 09:36:48
回答 2查看 5.1K关注 0票数 2

我编写了一个模式,它在Python中工作,但是当我在Go 1.9.2中运行时,它会恐慌:

代码语言:javascript
复制
panic: runtime error: invalid memory address or nil pointer dereference

守则如下:

代码语言:javascript
复制
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))

}

控制台中的结果如下

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-27 09:52:28

Go regexp不支持观看。您可以在这里使用带有替换组的否定式字符类来解决这个问题:

代码语言:javascript
复制
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演示

^/([^/].*|$)模式在字符串的开头匹配一个/,然后匹配除/之外的字符,后面跟着任何0+字符或字符串的末尾。^//([^/].*|$)与//匹配,后面跟着任何0+字符或字符串的结尾

如果要确保只匹配同一行上的字符串,请将[^/]替换为[^/\r\n],因为[^/]也匹配换行。

票数 4
EN

Stack Overflow用户

发布于 2018-02-27 09:41:45

Go regex不支持旁观者。

这将返回一个错误,但忽略它:

代码语言:javascript
复制
reSlash, _ := regexp.Compile(`^\/(?!\/)(.*?)`)

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49005416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档