如何在文件内容中应用正则表达式(Go)?

3
我使用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: 无法将b(类型[]byte)作为函数参数中的字符串类型使用

我该如何解决这个问题?


2
你为什么要尝试编译从文件中读取的内容?这个文件包含正则表达式吗? - hwnd
2个回答

6

正则表达式替换方法会将源参数中的正则表达式匹配项替换为替换参数。因为应用程序将“oldtext”替换为“newtext”,所以“oldtext”是正则表达式:

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

由于应用程序将文件内容作为[]byte,因此可以使用ReplaceAll而不是ReplaceAllString。这确实需要将替换字符串转换为[]byte,但这可能比将文件转换为字符串以进行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")))

6

看起来你正在尝试将文件中的内容编译成正则表达式。

以下语法应该可以解决你的问题。

x := string(b)
r, err := regexp.Compile("oldtext")
if err != nil {
    return // problem with the regular expression.
}
fmt.Println(r.ReplaceAllString(x, "newtext"))

然而,最好不要将二进制数据转换为字符串,直接使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接