在Go中获取正则表达式的解析树

时间:2013-12-14 09:16:29

标签: regex go tokenize

我尝试使用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>

有人能给我一个如何遍历和输出其解析树的简单示例吗?

1 个答案:

答案 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 referenceOpRune是主要字段。