在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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |