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

标签 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>

谁能给我一个简单的例子,说明如何遍历并输出它的解析树?

最佳答案

您调用的 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更多值得研究的领域:OpRune 是主要领域。

关于regex - 在 Go 中获取正则表达式的解析树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20581527/

相关文章:

regex - 使用 .htaccess 文件删除 .php 文件扩展名

go - 当我运行程序时,我只会得到默认结果。即使输入数字在该范围内

azure - 启用单点登录

bash - 你如何在 bash 中解析文件名?

python - NLTK - nltk.tokenize.RegexpTokenizer - 正则表达式未按预期工作

regex - 使用正则表达式删除多个配置文件中路径中的一级

Python - 多个变量的子

Golang 解引用函数返回值

java - 如何将 StringTokenizer 中的分隔符添加到单独的字符串中?

r - 按环视分割