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

在golang中使用嵌套组的regexp问题,第1张

概述考虑以下玩具示例.我想在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 mainimport (    "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

总结

以上是内存溢出为你收集整理的在golang中使用嵌套组的regexp问题全部内容,希望文章能够帮你解决在golang中使用嵌套组的regexp问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1294193.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存