第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

在不使用正則表達(dá)式的情況下替換整個(gè)單詞

在不使用正則表達(dá)式的情況下替換整個(gè)單詞

Go
慕慕森 2022-05-18 15:47:10
我正在使用string.Replace替換子字符串Afunc removeIP(text string) string {    text = strings.Replace(text, "someWord", "**NewWord**", -1)    return text}func removeIPUsingRegex(text string) string {    var re = regexp.MustCompile(`\b` + "someWord" + `\b`) // I want to replace whole word only    text = re.ReplaceAllString(text, "**NewWord**")}我在這里面臨的問題是,只有在字符串替換不支持的情況下,我才想替換整個(gè)單詞。因?yàn)槲冶仨毺鎿Q非常非常大的字符串,所以可能以 GB 為單位。與字符串替換相比,正則表達(dá)式非常慢。eg: text: "abcdef defgh /def/ .def/ =def= def xxxy"-> Replace defwith DEFoutput: "abcdef defgh /DEF/ .DEF/ =DEF= DEF xxxy"//注意只有整個(gè)單詞被替換了。正則表達(dá)式將時(shí)間縮短了近 100 倍(https://medium.com/codezillas/golang-replace-vs-regexp-de4e48482f53)。任何想法將不勝感激。
查看完整描述

1 回答

?
鴻蒙傳說

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊

使用的 KMP 算法

// ReplaceWholeWord ...


 func ReplaceWholeWord(text string, oldWord string, newWord string) string {

        var patternLength = len(oldWord)

        var textLength = len(text) 


        var copyIndex = 0

        var textIndex = 0

        var patternIndex = 0

        var newString strings.Builder

        var lps = computeLPSArray(oldWord)


        for textIndex < textLength {

            if oldWord[patternIndex] == text[textIndex] {

                patternIndex++

                textIndex++

            }

            if patternIndex == patternLength {

                startIndex := textIndex - patternIndex

                endIndex := textIndex - patternIndex + patternLength - 1


                if checkIfWholeWord(text, startIndex, endIndex) {

                    if copyIndex != startIndex {

                        newString.WriteString(text[copyIndex:startIndex])

                    }

                    newString.WriteString(newWord)

                    copyIndex = endIndex + 1

                }


                patternIndex = 0

                textIndex = endIndex + 1


            } else if textIndex < textLength && oldWord[patternIndex] != text[textIndex] {


                if patternIndex != 0 {

                    patternIndex = lps[patternIndex-1]


                } else {

                    textIndex = textIndex + 1

                }


            }

        }

        newString.WriteString(text[copyIndex:])


        return newString.String()

    }


    func computeLPSArray(pattern string) []int {

        var length = 0

        var i = 1

        var patternLength = len(pattern)


        var lps = make([]int, patternLength)


        lps[0] = 0


        for i = 1; i < patternLength; {

            if pattern[i] == pattern[length] {

                length++

                lps[i] = length

                i++


            } else {


                if length != 0 {

                    length = lps[length-1]


                } else {

                    lps[i] = length

                    i++

                }

            }

        }

        return lps

    }


    func checkIfWholeWord(text string, startIndex int, endIndex int) bool {

        startIndex = startIndex - 1

        endIndex = endIndex + 1


        if (startIndex < 0 && endIndex >= len(text)) ||

            (startIndex < 0 && endIndex < len(text) && isNonWord(text[endIndex])) ||

            (startIndex >= 0 && endIndex >= len(text) && isNonWord(text[startIndex])) ||

            (startIndex >= 0 && endIndex < len(text) && isNonWord(text[startIndex]) && isNonWord(text[endIndex])) {

            return true

        }


        return false

    }


    func isNonWord(c byte) bool {

        return !((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c == '_'))

    }


查看完整回答
反對(duì) 回復(fù) 2022-05-18
  • 1 回答
  • 0 關(guān)注
  • 99 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)