1 回答

TA貢獻1798條經(jīng)驗 獲得超7個贊
FindAllStringIndex(s string, n int)返回表達式所有連續(xù)匹配的字節(jié)開始/結(jié)束索引(即切片):
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 上執(zhí)行此操作,但以 UNIX 格式(換行)保存文件;如果輸入文件以 Windows 格式保存(回車和換行),則字節(jié)偏移量將分別增加到 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 關(guān)注
- 179 瀏覽
添加回答
舉報