Go语言中不区分大小写的字符串替换

zpjtge22  于 2023-06-19  发布在  Go
关注(0)|答案(4)|浏览(218)

NewReplacer.Replace是否可以进行不区分大小写的字符串替换?

r := strings.NewReplacer("html", "xml")
fmt.Println(r.Replace("This is <b>HTML</b>!"))

如果没有,在Go中进行不区分大小写的字符串替换的最佳方法是什么?

r1zhe5dt

r1zhe5dt1#

你可以使用正则表达式来实现:

re := regexp.MustCompile(`(?i)html`)
fmt.Println(re.ReplaceAllString("html HTML Html", "XML"))

Playground:http://play.golang.org/p/H0Gk6pbp2c
值得注意的是,根据语言和区域设置的不同,大小写可能会有所不同。例如,德语字母“ß”的大写形式是“SS”。虽然这通常不会影响英语文本,但在处理多语言文本和需要处理它们的程序时,这是要记住的。

pftdvrlh

pftdvrlh2#

通用解决方案如下:

import (
    "fmt"
    "regexp"
)

type CaseInsensitiveReplacer struct {
    toReplace   *regexp.Regexp
    replaceWith string
}

func NewCaseInsensitiveReplacer(toReplace, replaceWith string) *CaseInsensitiveReplacer {
    return &CaseInsensitiveReplacer{
        toReplace:   regexp.MustCompile("(?i)" + toReplace),
        replaceWith: replaceWith,
    }
}

func (cir *CaseInsensitiveReplacer) Replace(str string) string {
    return cir.toReplace.ReplaceAllString(str, cir.replaceWith)
}

然后通过以下方式使用:

r := NewCaseInsensitiveReplacer("html", "xml")
fmt.Println(r.Replace("This is <b>HTML</b>!"))

这里有一个link的例子在操场上。

vyswwuz2

vyswwuz23#

根据文件,它没有。
我不确定最好的方法是什么,但是可以在正则表达式中使用replace,并使用iflag使其不区分大小写

tyg4sfes

tyg4sfes4#

func StrReplaceAll(pBase, pOld, pNew string) string { //ignore case
    if len(pOld) == 0 || len(pBase) == 0 || len(pOld) > len(pBase) {
        return pBase
    }
    p1, p2, k1, k2, s, mEnd := 0, 0, 0, -2, "", false
    lenOld := len(pOld)
    mOld := strings.ToLower(pOld)
    b := strings.ToLower(pBase)
    for p2 >= 0 {
        p2 = IndexAt(b, mOld, p1)
        if p2 < 0 {
            p2, mEnd = len(b), true
        }
        if k2 == -2 {
            k2 = p2
        } else {
            k2 = k2 + p2 - p1
        }
        if p2 >= 0 {
            if mEnd {
                if k2 > k1 {
                    s += pBase[k1:k2]
                }
            } else {
                if k2 > k1 {
                    s += pBase[k1:k2] + pNew
                } else {
                    s += pNew
                }
            }
            if mEnd {
                break
            }
            p1, k1 = p2+lenOld, k2+lenOld
            k2 = k1
        }
    }
    return s
}
    
    func IndexAt(pStr, pSubStr string, pos int) int { //Index from position
        if pos >= len(pStr) {
            return -1
        }
        if pos < 0 {
            pos = 0
        }
        idx := strings.Index(pStr[pos:], pSubStr)
        if idx > -1 {
            idx += pos
        }
        return idx
    }

相关问题