1 回答
TA贡献1798条经验 获得超7个赞
FindAllStringIndex(s string, n int)返回表达式所有连续匹配的字节开始/结束索引(即切片):
package main
import "fmt"
import "io/ioutil"
import "regexp"
func main() {
fname := "C:\\Users\\UserName\\go\\src\\so56798431\\fname"
b, err := ioutil.ReadFile(fname)
if err != nil {
panic(err)
}
re, err := regexp.Compile("findme")
if err != nil {
// handle error
}
fmt.Println(re.FindAllStringIndex(string(b), -1))
}
输出:
[[12 18] [32 38]]
注意:我在 Microsoft Windows 上执行此操作,但以 UNIX 格式(换行)保存文件;如果输入文件以 Windows 格式保存(回车和换行),则字节偏移量将分别增加到 13 和 35。
更新:对于大文件,请使用bufio.Scanner;例如:
package main
import (
"bufio"
"fmt"
"log"
"os"
"regexp"
)
func main() {
fname, err := os.Open("C:\\Users\\UserName\\go\\src\\so56798431\\fname")
if err != nil {
log.Fatal(err)
}
defer fname.Close()
re, err := regexp.Compile("findme")
if err != nil {
// handle error
}
scanner := bufio.NewScanner(fname)
bytesRead := 0
for scanner.Scan() {
b := scanner.Text()
//fmt.Println(b)
results := re.FindAllStringIndex(b, -1)
for _, result := range results {
fmt.Println(bytesRead + result[0])
}
// account for UNIX EOL marker
bytesRead += len(b) + 1
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
}
输出:
12
32
- 1 回答
- 0 关注
- 136 浏览
添加回答
举报