搜索大小写不敏感并替换整个单词

时间:2018-02-16 06:21:45

标签: regex go

我需要搜索特定的模式,只有当它的整个单词或几个单词的组合我应该替换它。我正在与元字符挣扎 说我的搜索模式是:“corp。” 应该用“公司”代替 所以输入时:“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}")
}

1 个答案:

答案 0 :(得分:2)

这里有几个问题:

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

    (?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