0Pricing
Go Academy · 课时

替换文本

ReplaceAll 模式

替换文本 是 CoddyKit 上的免费 Go Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Go Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Go Academy 课程共包含 4 节课。

基于模式的替换

正则表达式不仅可以查找文本,还可以重写文本。ReplaceAllString 会将每个匹配项替换为替换字符串。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("[0-9]+")
    fmt.Println(re.ReplaceAllString("a1b2c3", "#"))
}

替换完整单词

像 cat|dog 这样的模式可以让您在一次操作中替换多个备选项。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("cat|dog")
    fmt.Println(re.ReplaceAllString("my cat and dog", "pet"))
}

合并空白字符

一种常见的清理操作是:使用 \s+ 将连续的空白字符替换为一个空格。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("\\s+")
    fmt.Println(re.ReplaceAllString("too   many    spaces", " "))
}

引用分组

在替换字符串中,$1 会插入第一个捕获组,$2 会插入第二个捕获组。这样可以重新排列匹配到的部分。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("(\\d+)-(\\d+)")
    fmt.Println(re.ReplaceAllString("12-34", "$2-$1"))
}

命名组引用

使用命名组时,可以在替换文本中使用 ${name},使代码更清晰。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("(?P<y>\\d{4})-(?P<m>\\d{2})")
    fmt.Println(re.ReplaceAllString("2026-05", "${m}/${y}"))
}

安全使用大括号

当组引用后面紧跟文本时,请使用 ${1} 大括号,这样可以避免将 $1 与更长的名称混淆。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("(\\d+)")
    fmt.Println(re.ReplaceAllString("7", "${1}px"))
}

字面替换

ReplaceAllLiteralString 会忽略 $ 引用,并严格按照原样插入替换文本。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("[0-9]+")
    fmt.Println(re.ReplaceAllLiteralString("a1", "$money"))
}

使用函数替换

ReplaceAllStringFunc 会针对每个匹配项调用您的函数,并替换为函数返回的内容。这样就可以执行计算后再进行替换。

package main

import (
    "fmt"
    "regexp"
    "strings"
)

func main() {
    re := regexp.MustCompile("[a-z]+")
    out := re.ReplaceAllStringFunc("go is fun", strings.ToUpper)
    fmt.Println(out)
}

计算得到的替换

在函数内部,您可以按照需要转换每个匹配项;这里的示例通过包裹每段匹配到的数字,将其复制为两份。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("[0-9]+")
    out := re.ReplaceAllStringFunc("id5 and id9", func(m string) string {
        return "<" + m + ">"
    })
    fmt.Println(out)
}

遮盖敏感数据

一个实用场景是:在记录日志之前,先删除数字(例如类似卡号的连续数字)。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("\\d{4}")
    fmt.Println(re.ReplaceAllString("card 1234 5678", "****"))
}

处理字节

也有适用于字节切片的变体,例如 ReplaceAll;它们与字符串方法相对应,可用于二进制数据或缓冲区数据。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("[0-9]+")
    out := re.ReplaceAll([]byte("a1b2"), []byte("#"))
    fmt.Println(string(out))
}

快速检查

如何在替换字符串中插入第一个捕获组?

回顾:替换文本

您已经学会了如何重写文本:

  • ReplaceAllString 会替换匹配项;$1/${name} 用于引用组。
  • ReplaceAllLiteralString 不会展开引用。
  • ReplaceAllStringFunc 会计算每次替换的内容。
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("(\\w+)\\s(\\w+)")
    fmt.Println(re.ReplaceAllString("Ada Lovelace", "$2, $1"))
}

常见问题解答

「替换文本」课时是免费的吗?

是的 — 「替换文本」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Go Academy 课程的其余内容,请升级到 CoddyKit PRO。 Go Academy 课程共包含 4 节课。

「替换文本」这节课中我会学到什么?

ReplaceAll 模式 你通过在浏览器中直接运行的动手代码来练习 Go Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Go Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Go Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「替换文本」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Go Academy 课中编写并运行代码吗?

能。每节 Go Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. regexp 基础
  2. 查找与提取
  3. 替换文本
  4. 性能技巧
← 返回 Go Academy