加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在golang中使用嵌套组的regexp问题

发布时间:2020-12-16 19:04:36 所属栏目:大数据 来源:网络整理
导读:考虑以下玩具示例.我想在Go中使用正则表达式匹配,其中名称是由单个#分隔的字母序列,因此#a #aaa有效,但#或a ## a不是.我可以通过以下两种方式编写正则表达式: r1 := regexp.MustCompile(`^a+(#a+)*$`)r2 := regexp.MustCompile(`^(a+#)*a+$`) 这两项都有效.
考虑以下玩具示例.我想在Go中使用正则表达式匹配,其中名称是由单个#分隔的字母序列,因此#a #aaa有效,但#或a ## a不是.我可以通过以下两种方式编写正则表达式:
r1 := regexp.MustCompile(`^a+(#a+)*$`)
r2 := regexp.MustCompile(`^(a+#)*a+$`)

这两项都有效.现在考虑更复杂的匹配由单斜杠分隔的名称序列的任务.如上所述,我可以用两种方式编写代码:

^N+(/N+)*$
^(N+/)*N+$

其中N是带有^和$stripped的名称的正则表达式.由于我有两个N的情况,所以现在我可以有4个正则表达式:

^a+(#a+)*(/a+(#a+)*)*$
    ^(a+#)*a+(/a+(#a+)*)*$
    ^((a+#)*a+/)*a+(#a+)*$
    ^((a+#)*a+/)*(a+#)*a+$

问题是为什么当匹配字符串“aa #a #a / a#a / a”时,第一个失败而其余3个案例按预期工作?即是什么导致第一个正则表达式不匹配?完整的code是:

package main

import (
    "fmt"
    "regexp"
)

func main() {
    str := "aa#a#a/a#a/a"
    regs := []string {
        `^a+(#a+)*(/a+(#a+)*)*$`,`^(a+#)*a+(/a+(#a+)*)*$`,`^((a+#)*a+/)*a+(#a+)*$`,`^((a+#)*a+/)*(a+#)*a+$`,}    
    for _,r := range(regs) {
        fmt.Println(regexp.MustCompile(r).MatchString(str))
    } 
}

令人惊讶的是它打印错误的真实

这一定是golang regexp引擎中的一个bug.一个更简单的测试用例是^ a(/ a(#a)*)* $无法匹配a / a#a而^(a)(/ a(#a)*)* $有效,见 http://play.golang.org/p/CDKxVeXW98.

我提交了https://github.com/golang/go/issues/11905

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读