我试图在字符串中找到命名捕获组的开头以创建一个简单的解析器(请参阅相关问题)。为此,extract
函数会记住last4
变量中的最后一个字符。如果最后 4 个字符等于 "(?P<" 它是捕获组的开始:
package main
import "fmt"
const sample string = `/(?P<country>m((a|b).+)(x|y)n)/(?P<city>.+)`
func main() {
extract(sample)
}
func extract(regex string) {
last4 := new([4]int32)
for _, c := range regex {
last4[0], last4[1], last4[2], last4[3] = last4[1], last4[2], last4[3], c
last4String := fmt.Sprintf("%c%c%c%c\n", last4[0], last4[1], last4[2], last4[3])
if last4String == "(?P<" {
fmt.Print("start of capturing group")
}
}
}
http://play.golang.org/p/pqA-wCuvux
但是这段代码什么也没打印!永远不会是真的,尽管如果我在循环内last4String == "(?P<"
打印,这个子字符串会出现在输出中。last4String
那么如何在 Go 中比较字符串呢?
还有比将 int32 数组转换为字符串更优雅的方法fmt.Sprintf("%c%c%c%c\n", last4[0], last4[1], last4[2], last4[3])
吗?
还有什么可以更好的吗?我的代码对我来说有点不雅。