欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang 正則匹配效率詳解

 更新時(shí)間:2021年04月25日 14:47:55   作者:無(wú)痕空間  
這篇文章主要介紹了Golang 正則匹配效率詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

最近有個(gè)小需求,校驗(yàn)IMEI是否為15位純數(shù)字(是否合法)

以下是正則匹配

與自己實(shí)現(xiàn)的簡(jiǎn)單驗(yàn)證方式進(jìn)行壓測(cè)

package main
import (
    "regexp"
    "testing"
)
func BenchmarkIsDigitalRegexp(b *testing.B) {
    for i := 0; i < b.N; i++ {
        _ = isDigitalRegexp("358901806972417")
    }
}
func BenchmarkIsDigital(b *testing.B) {
    for i := 0; i < b.N; i++ {
        _ = isDigital("358901806972417")
    }
}
func isDigitalRegexp(imei string) bool {
    if ok, _ := regexp.Match("^[0-9]{15}$", []byte(imei)); ok {
        return true
    }else {
        return false
    }
}
func isDigital(imei string) bool {
    n := len(imei)
    if n == 15 {
        for i := 0; i < n; i++ {
            if imei[i] >= 48 && imei[i] <= 57 {
                continue
            }else {
                return false
            }
        }
    }else {
        return false
    }
    return true
}

壓測(cè)結(jié)果:

C:\Users\M709FJSA\go\src\pprof_demo\re>go test -bench=. -benchmem
goos: windows
goarch: amd64
pkg: pprof_demo/re
BenchmarkIsDigitalRegexp-12       300000              4644 ns/op            6450 B/op         70 allocs/op
BenchmarkIsDigital-12           200000000                9.48 ns/op            0 B/op          0 allocs/op
PASS
ok      pprof_demo/re   4.577s

很明顯,正則需要重新分配內(nèi)存較多,從pprof生成圖也可以看出,正則調(diào)用關(guān)系錯(cuò)綜復(fù)雜

在這里插入圖片描述

補(bǔ)充:Golang —— 正則表達(dá)式

正則表達(dá)式是一種進(jìn)行模式匹配和文本操縱的復(fù)雜而又強(qiáng)大的工具。雖然正則表達(dá)式比純粹的文本匹配效率低,但是它卻更靈活。

按照它的語(yǔ)法規(guī)則,隨需構(gòu)造出的匹配模式就能夠從原始文本中篩選出幾乎任何你想要得到的字符組合。

Go語(yǔ)言通過(guò)regexp標(biāo)準(zhǔn)包為正則表達(dá)式提供了官方支持,如果你已經(jīng)使用過(guò)其他編程語(yǔ)言提供的正則相關(guān)功能,那么你應(yīng)該對(duì)Go語(yǔ)言版本的不會(huì)太陌生,但是它們之間也有一些小的差異,因?yàn)镚o實(shí)現(xiàn)的是RE2標(biāo)準(zhǔn),除了\C。

其實(shí)字符串處理我們可以使用strings包來(lái)進(jìn)行搜索(Contains、Index)、替換(Replace)和解析(Split、Join)等操作,但是這些都是簡(jiǎn)單的字符串操作,他們的搜索都是大小寫(xiě)敏感,而且固定的字符串,如果我們需要匹配可變的那種就沒(méi)辦法實(shí)現(xiàn)了,當(dāng)然如果strings包能解決你的問(wèn)題,那么就盡量使用它來(lái)解決。

因?yàn)樗麄冏銐蚝?jiǎn)單、而且性能和可讀性都會(huì)比正則好。

正則匹配規(guī)則圖

詳細(xì)請(qǐng)參考官方文檔

在這里插入圖片描述

簡(jiǎn)單的正則表達(dá)式

1. 匹配任意類型

	buf := "abc azc a7c aac 888 a9c tac"
	// 1. 解釋規(guī)則
	reg := regexp.MustCompile(`a.c`) // 這里會(huì)解析正則表達(dá)式,成功就返回解釋器(. ——> 除\n外任意字符)
	if reg == nil { // 解釋失敗
		fmt.Println("MustCompile err")
		return
	}
	// 2. 根據(jù)規(guī)則提取關(guān)鍵信息
	res :=  reg.FindAllStringSubmatch(buf, -1) //-1表示匹配所有的
	// res :=  reg.FindAllStringSubmatch(buf, 1) //1表示匹配一個(gè)
	fmt.Println("res = ", res)

執(zhí)行結(jié)果:

res =  [[abc] [azc] [a7c] [aac] [a9c]]

2. 使用 […] (字符集) 匹配[0-9]之間的數(shù)值

  buf := "abc azc a7c aac 888 a9c  tac"
 
    //1) 解釋規(guī)則, 它會(huì)解析正則表達(dá)式,如果成功返回解釋器
    reg1 := regexp.MustCompile(`a[0-9]c`)
 
    if reg1 == nil { //解釋失敗,返回nil
        fmt.Println("MustCompile err")
        return
    }
 
    //2) 根據(jù)規(guī)則提取關(guān)鍵信息
    result1 := reg1.FindAllStringSubmatch(buf, -1)
    fmt.Println("result1 = ", result1)

執(zhí)行結(jié)果:

result1 =  [[a7c] [a9c]]

3. 使用 \d 匹配[0-9]之間的數(shù)值

  buf := "abc azc a7c aac 888 a9c  tac"
 
    //1) 解釋規(guī)則, 它會(huì)解析正則表達(dá)式,如果成功返回解釋器
    reg1 := regexp.MustCompile(`a\dc`)
    if reg1 == nil { //解釋失敗,返回nil
        fmt.Println("MustCompile err")
        return
    }
 
    //2) 根據(jù)規(guī)則提取關(guān)鍵信息
    result1 := reg1.FindAllStringSubmatch(buf, -1)
    fmt.Println("result1 = ", result1)

執(zhí)行結(jié)果:

result1 =  [[a7c] [a9c]]

4.匹配小數(shù)

 buf := "3.14 456 adsc as23d 1.23 3. 9.99 1lsa23d 0.08 0.00  "
 // 解釋正則表達(dá)式
 reg := regexp.MustCompile(`\d+\.\d+`) // +表示匹配前一個(gè)字符的一次或者多次
 if reg == nil {
  fmt.Println("MustCompile err")
  return
 }
 // 提取關(guān)鍵信息
 res := reg.FindAllStringSubmatch(buf, -1)
 fmt.Println("res = ", res)

執(zhí)行結(jié)果:

res =  [[3.14] [1.23] [9.99] [0.08] [0.00]]

5.匹配信息中某關(guān)鍵字并過(guò)濾帶標(biāo)簽的

	// ` ` 是原生字符串
	buf := `
			<!DOCTYPE html>
			<html lang="zh-CN">
			<head>
				<title>Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)文檔中文版 | Go語(yǔ)言中文網(wǎng) | Golang中文社區(qū) | Golang中國(guó)</title>
				<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no">
				<meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1">
				<meta charset="utf-8">
				<link rel="shortcut icon" href="/static/img/go.ico" rel="external nofollow" >
				<link rel="apple-touch-icon" type="image/png" href="/static/img/logo2.png" rel="external nofollow" >
				<meta name="author" content="polaris <polaris@studygolang.com>">
				<meta name="keywords" content="中文, 文檔, 標(biāo)準(zhǔn)庫(kù), Go語(yǔ)言,Golang,Go社區(qū),Go中文社區(qū),Golang中文社區(qū),Go語(yǔ)言社區(qū),Go語(yǔ)言學(xué)習(xí),學(xué)習(xí)Go語(yǔ)言,Go語(yǔ)言學(xué)習(xí)園地,Golang 中國(guó),Golang中國(guó),Golang China, Go語(yǔ)言論壇, Go語(yǔ)言中文網(wǎng)">
				<meta name="description" content="Go語(yǔ)言文檔中文版,Go語(yǔ)言中文網(wǎng),中國(guó) Golang 社區(qū),Go語(yǔ)言學(xué)習(xí)園地,致力于構(gòu)建完善的 Golang 中文社區(qū),Go語(yǔ)言愛(ài)好者的學(xué)習(xí)家園。分享 Go 語(yǔ)言知識(shí),交流使用經(jīng)驗(yàn)">
			</head>
				<div>和愛(ài)好</div>
				<div>哈哈
				你在嗎
				不在
				</div>
				<div>測(cè)試</div>
				<div>你過(guò)來(lái)啊</div>
			
			<frameset cols="15,85">
				<frame src="/static/pkgdoc/i.html">
				<frame name="main" src="/static/pkgdoc/main.html" tppabs="main.html" >
				<noframes>
				</noframes>
			</frameset>
			</html>
			`
	// 解釋正則表達(dá)式
	reg := regexp.MustCompile(`<div>(?s:(.*?))</div>`) // s用來(lái)處理?yè)Q行情況
	if reg == nil {
		fmt.Println("MustCompile err")
		return
	}
	// 提取關(guān)鍵字
	res := reg.FindAllStringSubmatch(buf, -1)
	// fmt.Println("res = ", res)
	// 過(guò)濾<> </>
	for _, text := range res {
		//fmt.Println("text[0] = ", text[0]) // 帶<> </>的
		fmt.Println("text[1] = ", text[1]) //  不帶<> </> 的
	}

執(zhí)行結(jié)果:

text[1] =  和愛(ài)好
text[1] =  哈哈
    你在嗎
    不在
    
text[1] =  測(cè)試
text[1] =  你過(guò)來(lái)啊

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • GO項(xiàng)目部署Linux服務(wù)器的實(shí)現(xiàn)示例

    GO項(xiàng)目部署Linux服務(wù)器的實(shí)現(xiàn)示例

    本文主要介紹了GO項(xiàng)目部署Linux服務(wù)器的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • Golang實(shí)現(xiàn)可重入鎖的示例代碼

    Golang實(shí)現(xiàn)可重入鎖的示例代碼

    可重入鎖指的是同一個(gè)線程外層函數(shù)獲得鎖之后,內(nèi)層遞歸函數(shù)仍然能獲取該鎖的代碼,在同一個(gè)線程在外層方法獲取鎖的時(shí)候,在進(jìn)入內(nèi)層方法會(huì)自動(dòng)獲取鎖。本文將用Golang實(shí)現(xiàn)可重入鎖,需要的可以參考一下
    2022-05-05
  • Golang實(shí)現(xiàn)解析JSON的三種方法總結(jié)

    Golang實(shí)現(xiàn)解析JSON的三種方法總結(jié)

    這篇文章主要為大家詳細(xì)介紹了Golang實(shí)現(xiàn)解析JSON的三種方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)了解JSON有一定幫助,需要的可以參考一下
    2022-09-09
  • go語(yǔ)言中的defer關(guān)鍵字

    go語(yǔ)言中的defer關(guān)鍵字

    這篇文章介紹了go語(yǔ)言中的defer關(guān)鍵字,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Go設(shè)計(jì)模式之觀察者模式講解和代碼示例

    Go設(shè)計(jì)模式之觀察者模式講解和代碼示例

    觀察者是一種行為設(shè)計(jì)模式, 允許一個(gè)對(duì)象將其狀態(tài)的改變通知其他對(duì)象,觀察者模式提供了一種作用于任何實(shí)現(xiàn)了訂閱者接口的對(duì)象的機(jī)制, 可對(duì)其事件進(jìn)行訂閱和取消訂閱,本文就通過(guò)代碼示例給大家詳細(xì)介紹一下Go的觀察者模式,需要的朋友可以參考下
    2023-07-07
  • go基礎(chǔ)語(yǔ)法50問(wèn)及方法詳解

    go基礎(chǔ)語(yǔ)法50問(wèn)及方法詳解

    這篇文章主要為大家介紹了go基礎(chǔ)語(yǔ)法50問(wèn)及方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • golang使用mTLS實(shí)現(xiàn)雙向加密認(rèn)證http通信

    golang使用mTLS實(shí)現(xiàn)雙向加密認(rèn)證http通信

    這篇文章主要為大家介紹了golang如何調(diào)用mTLS實(shí)現(xiàn)雙向加密認(rèn)證http通信,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的小伙伴可以參考下
    2023-08-08
  • Golang中的四個(gè)括號(hào)示例詳解

    Golang中的四個(gè)括號(hào)示例詳解

    這篇文章主要介紹了Golang中的四個(gè)括號(hào),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),通過(guò)實(shí)例代碼補(bǔ)充介紹了有效的括號(hào)golang實(shí)現(xiàn),需要的朋友可以參考下
    2024-03-03
  • CMD下執(zhí)行Go出現(xiàn)中文亂碼的解決方法

    CMD下執(zhí)行Go出現(xiàn)中文亂碼的解決方法

    需要在Go寫(xiě)的服務(wù)里面調(diào)用命令行或者批處理,并根據(jù)返回的結(jié)果做處理。但是windows下面用cmd返回中文會(huì)出現(xiàn)亂碼,本文就詳細(xì)的介紹一下解決方法,感興趣的可以了解一下
    2021-12-12
  • golang API開(kāi)發(fā)過(guò)程的中的自動(dòng)重啟方式(基于gin框架)

    golang API開(kāi)發(fā)過(guò)程的中的自動(dòng)重啟方式(基于gin框架)

    這篇文章主要介紹了golang API開(kāi)發(fā)過(guò)程的中的自動(dòng)重啟方式(基于gin框架),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12

最新評(píng)論