我需要搜索特定的模式,并且只有当它的整个单词或几个单词的组合都应该替换时,才需要搜索。我正在努力与元字符
假设我的搜索模式是:“公司”。
应替换为“公司”
因此,当输入:“SS Corp. Ltd”时,预期输出是“SS Corporation Ltd”

我尝试使用:

package main

import (
    "fmt"
    "regexp"
)

func main() {
    search :="corp."
    rep := "Corporation"
    sample :="SS Corp. LTd"
    var re = regexp.MustCompile(`(^|[^_])\b`+search+`\b([^_]|$)`)
    s2 := re.ReplaceAllString(sample, "${1}"+rep+"${2}")
}

最佳答案

这里有几个问题:

  • 未经换码的.与除换行符以外的任何字符匹配,必须将其转义。由于您是动态构建模式,因此请使用regexp.QuoteMeta
  • 由于\b后的.单词边界需要单词char,因此您不能期望a\.\ba. b匹配。将边界替换为(^|[^\p{L}0-9_])作为前导边界,并将([^\p{L}0-9_]|$)替换为尾随边界。
  • 在此阶段,将按照以下方式构建模式:`(?i)(^|[^\p{L}0-9_])`+regexp.QuoteMeta(search)+`([^\p{L}0-9_]|$)`,但是由于两个边界都在使用模式,因此您将永远不会匹配连续的匹配项(corp. corp.将导致Corporation corp.,第二个将不被替换)。您应该重复更换,直到找不到正则表达式匹配项为止。
  • 为了使模式不区分大小写,请在模式开始时使用(?i)内联修饰符。

  • 正则表达式看起来像
    (?i)(^|[^\p{L}0-9_])corp\.([^\p{L}0-9_]|$)
    

    参见regex demo

    详细信息
  • (?i)-不区分大小写的修饰符
  • (^|[^\p{L}0-9_])-字符串的开头或一个字符,而不是Unicode字母,ASCII数字和_
  • corp\.-一个corp.子字符串
  • ([^\p{L}0-9_]|$)-Unicode字母,ASCII数字和_以外的字符或字符串
  • 的结尾

    参见this example demo:
    package main
    
    import (
        "fmt"
        "regexp"
    )
    
    func main() {
        search :="corp."
        rep := "Corporation"
        sample :="SS Corp. Corp. LTd"
        var re = regexp.MustCompile(`(?i)(^|[^\p{L}0-9_])`+regexp.QuoteMeta(search)+`([^\p{L}0-9_]|$)`)
        fmt.Println(re)
        var res = sample
        for re.MatchString(res) {
            res = ReplaceWith(res, re, "${1}"+rep+"${2}")
        }
        fmt.Println(res)
    }
    
    func ReplaceWith(s string, re *regexp.Regexp, repl string) string {
        return re.ReplaceAllString(s, repl)
    }
    

    结果:SS Corporation Corporation LTd

    10-04 11:40