我正在使用 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/