regex - 如何将正则表达式应用于文件中的内容(Go)?

标签 regex go

我正在使用 io/ioutil 包来读取文件:

package main

import (
    "fmt"
    "github.com/codegangsta/cli"
    "io/ioutil"
    "os"
    "regexp"
)

func main() {
    app := cli.NewApp()
    app.Name = "m2k"
    app.Usage = "convert markdown to kindle"

    app.Action = func(c *cli.Context) {
        file := "no file"

        if len(c.Args().First()) > 0 {
            file = c.Args().First()

            fmt.Println("worked:", file)

            b, err := ioutil.ReadFile(file)
            if err != nil {
                panic(err)
            }

            r, _ := regexp.Compile(b)
            fmt.Println(r.ReplaceAllString("oldtext", "newtext"))
        }

    }

    app.Run(os.Args)
}

// $ go run io2.go input.txt

// input.txt

// text text oldtext oldtext

我想将正则表达式应用于文件的内容:

r, _ := regexp.Compile(b)
mt.Println(r.ReplaceAllString("oldtext", "newtext"))

问题是 regexp.Compile 似乎不适用于 byte 类型:

./io2.go:29: cannot use b (type []byte) as type string in function argument

我该如何解决这个问题?

最佳答案

正则表达式替换方法返回源参数,正则表达式匹配替换为替换参数。因为应用程序正在用“新文本”替换“旧文本”,所以“旧文本”是正则表达式:

r, err := regexp.Compile("oldtext")

因为应用程序将文件内容作为 [] 字节,所以可以使用 ReplaceAll 代替 ReplaceAllString。这确实需要将替换字符串转换为 [] 字节,但这可能比将文件转换为 ReplaceAllString 的字符串更便宜。

r.ReplaceAll(b, []byte("newtext"))

ReplaceAll 的结果是一个可以直接写入标准输出的 []byte。无需 fmt.Println 输出。

完整代码如下:

b, err := ioutil.ReadFile(file)
if err != nil {
  panic(err)
}

r, err := regexp.Compile("oldtext")
if err != nil {
  // handle error
}
os.Stdout.Write(r.ReplaceAll(b, []byte("newtext")))

关于regex - 如何将正则表达式应用于文件中的内容(Go)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28574609/

相关文章:

正则表达式:可选,后跟否定前瞻

asynchronous - 在golang中,如何编写一个为下一阶段引入延迟的流水线阶段?

Go/Golang 从 Mac 交叉编译到 Windows : fatal error: 'windows.h' file not found

json - 如何从 http.Get 获取 JSON 响应

go - 如何计算列号和行号的偏移量? - 去

javascript - 标记特定字符串替换

c# - 清理 IDisposable 问题

python - 识别正则表达式中的新行

python - TypeError from use of "|"in re.search ("RE"|"RE"|"RE", string)

c++ - 具有大字符指针的 Golang CGO - SEGSERV