我需要搜索特定的模式,只有当它的整个单词或几个单词的组合我应该替换它。我正在与元字符挣扎 说我的搜索模式是:“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}")
}
答案 0 :(得分: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数字和_
或字符串结尾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
。