我需要搜索特定的模式,并且只有当它的整个单词或几个单词的组合都应该替换时,才需要搜索。我正在努力与元字符
假设我的搜索模式是:“公司”。
应替换为“公司”
因此,当输入:“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\.\b
与a. 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
。