NewReplacer.Replace是否可以进行不区分大小写的字符串替换?
r := strings.NewReplacer("html", "xml") fmt.Println(r.Replace("This is <b>HTML</b>!"))
如果没有,在Go中进行不区分大小写的字符串替换的最佳方法是什么?
r1zhe5dt1#
你可以使用正则表达式来实现:
re := regexp.MustCompile(`(?i)html`) fmt.Println(re.ReplaceAllString("html HTML Html", "XML"))
Playground:http://play.golang.org/p/H0Gk6pbp2c。值得注意的是,根据语言和区域设置的不同,大小写可能会有所不同。例如,德语字母“ß”的大写形式是“SS”。虽然这通常不会影响英语文本,但在处理多语言文本和需要处理它们的程序时,这是要记住的。
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的例子在操场上。
vyswwuz23#
根据文件,它没有。我不确定最好的方法是什么,但是可以在正则表达式中使用replace,并使用iflag使其不区分大小写
i
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 }
4条答案
按热度按时间r1zhe5dt1#
你可以使用正则表达式来实现:
Playground:http://play.golang.org/p/H0Gk6pbp2c。
值得注意的是,根据语言和区域设置的不同,大小写可能会有所不同。例如,德语字母“ß”的大写形式是“SS”。虽然这通常不会影响英语文本,但在处理多语言文本和需要处理它们的程序时,这是要记住的。
pftdvrlh2#
通用解决方案如下:
然后通过以下方式使用:
这里有一个link的例子在操场上。
vyswwuz23#
根据文件,它没有。
我不确定最好的方法是什么,但是可以在正则表达式中使用replace,并使用
i
flag使其不区分大小写tyg4sfes4#