Go - 正则表达式内循环

我有一个包含 600 个正则表达式模式列表的文件,大多数执行这些模式是为了找到网站的特定 ID。


例子:


regex/www\.effectiveperformanceformat\.com/5

regex/bam-cell\.nr-data\.net/5

regex/advgoogle\.com/5

regex/googleapi\.club/5

regex/doubleclickbygoogle\.com/5

regex/googlerank\.info/5

regex/google-pr7\.de/5

regex/usemarketings\.com/5

regex/google-rank\.org/5

regex/googleanalytcs\.com/5

regex/xml\.trafficmoose\.com/5

regex/265\.com/5

regex/app-measurement\.com/5

regex/loftsbaacad\.com/5

regex/toldmeflex\.com/5

regex/r\.baresi\.xyz/5

regex/molodgytot\.biz/5

regex/ec\.walkme\.com/5

regex/px\.ads\.linkedin\.com/5

regex/hinisanex\.biz/5

regex/buysellads\.com/5

regex/buysellads\.net/5

regex/servedby-buysellads\.com/5

regex/carbonads\.(net|com)/5

regex/oulddev\.biz/5

regex/click\.hoolig\.app/5

regex/engine\.blacraft\.com/5

regex/mc\.yandex\.ru/5

regex/ads\.gaming1\.com/5

regex/adform\.net/5

regex/luzulabeguile\.com/5

regex/ficanportio\.biz/5

regex/hidelen\.com/5

regex/earchmess\.fun/5

regex/acrvclk\.com/5

regex/track\.wg-aff\.com/5

regex/thumb\.tapecontent\.net/5

regex/betgorebysson\.club/5

regex/in-page-push\.com/5

regex/itphanpytor\.club/5

regex/mktoresp\.com/5

regex/xid\.i-mobile\.co\.jp/5

regex/ads\.tremorhub\.com/5

到目前为止,我正在使用的是这样的


for _, line := range file {

l := line

data := strings.Split(l, "/")

if data[0] == "regex" {

                match, _ := regexp.MatchString(``+data[1]+``, website)

                if match {

                    id, _ = strconv.Atoi(data[2])

                }

            }

}

这是有效的,但我想知道是否有更优化的方法来做到这一点。因为,如果网站与顶部的正则表达式匹配,那就太好了,但如果不匹配,我需要一遍又一遍地循环直到找到它。


任何人都可以帮我改进这个吗?


当年话下
浏览 136回答 1
1回答

jeck猫

为了减少缓存正则表达式的时间。package mainimport (    "bufio"    "bytes"    "fmt"    csvutils "github.com/alessiosavi/GoGPUtils/csv"    "log"    "os"    "regexp"    "strconv"    "strings"    "time")func main() {    now := time.Now()    Precomputed("www.google.it")    fmt.Println(time.Since(now))    now = time.Now()    NonPrecomputed("www.google.it")    fmt.Println(time.Since(now))}func NonPrecomputed(website string) int {    for _, line := range cachedLines {        l := line        data := strings.Split(l, "/")        if data[0] == "regex" {            match, _ := regexp.MatchString(``+data[1]+``, website)            if match {                id, _ := strconv.Atoi(data[2])                return id            }        }    }    return -1}func Precomputed(site string) int {    for regex, id := range rawRegex {        if ok := regex.MatchString(site); ok {            return id        }    }    return -1}var rawRegex map[*regexp.Regexp]int = make(map[*regexp.Regexp]int)var cachedLines []stringvar sites []stringfunc init() {    now := time.Now()    file, err := os.ReadFile("regex.txt")    if err != nil {        panic(err)    }    scanner := bufio.NewScanner(bytes.NewReader(file))    for scanner.Scan() {        txt := scanner.Text()        cachedLines = append(cachedLines, txt)        split := strings.Split(txt, "/")        if len(split) == 3 {            compile, err := regexp.Compile(split[1])            if err != nil {                panic(err)            }            if rawRegex[compile], err = strconv.Atoi(split[2]); err != nil {                panic(err)            }        }    }    file, err = os.ReadFile("top500Domains.csv")    if err != nil {        panic(err)    }    _, csvData, err := csvutils.ReadCSV(file, ',')    if err != nil {        panic(err)    }    for _, line := range csvData {        sites = append(sites, line[1])    }    log.Println("Init took:", time.Since(now))}该init方法负责正则表达式缓存。它将加载具有相对索引的地图中的所有正则表达式(它也会加载测试数据,仅用于基准测试)。然后你有2个方法:Precomputed: 使用缓存正则表达式的映射NonPrecomputed:您的代码段的复制->粘贴如您所见,该NonPrecomputed方法能够执行 63 次,而Precomputed能够执行 10000 次。如您所见,当方法没有分配时(由于初始缓存),NonPrecomputed方法分配了 ~67 MBPrecomputedC:\opt\SP\Workspace\Go\Temp>go test -bench=. -benchmem -benchtime=10s2022/11/03 00:45:35 Init took: 10.8397msgoos: windowsgoarch: amd64pkg: Tempcpu: 11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHzBenchmark_Precomputed-8            10000           1113887 ns/op               0 B/op          0 allocs/opBenchmark_NonPrecomputed-8            63         298434740 ns/op        65782238 B/op     484595 allocs/opPASSok      Temp    41.548s
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go