我尝试使用regex.syntax
module来访问已解析的正则表达式的各个标记但没有成功:我能够输出的唯一一个是正则表达式的简化/优化版本。
代码:
package main
import (
"fmt"
"regexp/syntax"
)
func main() {
p, e := syntax.Parse(`[0120-2]@[ab][0-9]`, 'i')
fmt.Println(p)
fmt.Println(e)
}
输出:
[0-2](?i:@)[A-Ba-b][0-9]
<nil>
有人能给我一个如何遍历和输出其解析树的简单示例吗?
答案 0 :(得分:4)
您正在调用的Parse
函数是正确的。当您调用fmt.Println(p)
时,解析树将转换为字符串,这就是您看到的输出只是等效正则表达式的原因。
Parse
的返回值是指向syntax.Regexp
结构的指针。要遍历返回的解析树,您需要查看返回结构的Sub
字段,该字段列出了所有子表达式(指向syntax.Regexp
结构的指针)。例如:
func printSummary(r *syntax.Regexp) {
fmt.Printf("%v has %d sub expressions\n", r, len(r.Sub))
for i, s := range r.Sub {
fmt.Printf("Child %d:\n", i)
printSummary(s)
}
}
有关值得检查的更多字段,请参阅syntax package reference:Op
和Rune
是主要字段。