Golang Regexp.ReplaceAllStringFunc
最后修改于 2025 年 4 月 20 日
本教程将解释如何在 Go 中使用 Regexp.ReplaceAllStringFunc 方法。我们将介绍使用正则表达式的高级字符串替换。
一个 正则表达式 是一个定义搜索模式的字符序列。它用于在字符串中进行模式匹配。
Regexp.ReplaceAllStringFunc 方法使用自定义函数替换正则表达式模式的所有匹配项。这允许动态替换。
基本的 ReplaceAllStringFunc 示例
ReplaceAllStringFunc 最简单的用法是将匹配的文本转换为大写。在这里,我们将所有 "go" 的出现都大写。
package main
import (
"fmt"
"regexp"
"strings"
)
func main() {
re := regexp.MustCompile(`go`)
text := "Let's go to the Go conference and learn Go!"
result := re.ReplaceAllStringFunc(text, func(match string) string {
return strings.ToUpper(match)
})
fmt.Println(result)
}
该函数匹配 "go"(区分大小写)并应用转换。输出显示所有匹配项都已转换为大写。
条件替换
我们可以在替换函数中使用条件。此示例将大于 5 的数字替换为其对应的单词。
package main
import (
"fmt"
"regexp"
"strconv"
)
func main() {
re := regexp.MustCompile(`\d+`)
text := "I have 3 apples, 7 oranges, and 10 bananas"
result := re.ReplaceAllStringFunc(text, func(match string) string {
num, _ := strconv.Atoi(match)
if num > 5 {
return "many"
}
return match
})
fmt.Println(result)
}
正则表达式匹配所有数字序列。该函数将它们转换为整数并应用条件逻辑。只有大于 5 的数字才会被替换。
复杂转换
ReplaceAllStringFunc 可以执行复杂的转换。在这里,我们将日期从 MM/DD/YYYY 格式化为 YYYY-MM-DD。
package main
import (
"fmt"
"regexp"
"strings"
)
func main() {
re := regexp.MustCompile(`(\d{2})/(\d{2})/(\d{4})`)
text := "Start date: 04/20/2025, End date: 12/31/2025"
result := re.ReplaceAllStringFunc(text, func(match string) string {
parts := strings.Split(match, "/")
return fmt.Sprintf("%s-%s-%s", parts[2], parts[0], parts[1])
})
fmt.Println(result)
}
该模式捕获日期组件。该函数分割匹配项并重新排列部分。这展示了如何解析和重新格式化匹配的文本。
动态内容生成
我们可以动态生成替换内容。此示例扩展了文本中的缩写。
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`\b[A-Z]{2,}\b`)
text := "The WHO declared COVID a PHEIC in JAN 2020"
abbrevs := map[string]string{
"WHO": "World Health Organization",
"PHEIC": "Public Health Emergency of International Concern",
"JAN": "January",
}
result := re.ReplaceAllStringFunc(text, func(match string) string {
if expansion, ok := abbrevs[match]; ok {
return expansion
}
return match
})
fmt.Println(result)
}
正则表达式匹配 2 个或更多字母的大写单词。该函数在映射表中查找匹配项,并在找到时返回展开后的内容。未匹配的缩写保持不变。
转义特殊字符
此示例演示了如何转义匹配文本中的 HTML 特殊字符。它展示了替换函数的与安全相关的用法。
package main
import (
"fmt"
"html"
"regexp"
)
func main() {
re := regexp.MustCompile(`<.*?>`)
text := "Alert: <script>alert('xss')</script> detected"
result := re.ReplaceAllStringFunc(text, func(match string) string {
return html.EscapeString(match)
})
fmt.Println(result)
}
该模式匹配 HTML/XML 标签。该函数转义匹配项中的所有特殊字符。这可以防止 Web 应用程序中潜在的 XSS 攻击。
多步处理
替换函数可以执行多个处理步骤。在这里,我们清理和标准化产品代码。
package main
import (
"fmt"
"regexp"
"strings"
)
func main() {
re := regexp.MustCompile(`[A-Z]{2}\d{3}[a-z]?`)
text := "Product codes: AB123, CD456x, EF789, GH101 invalid"
result := re.ReplaceAllStringFunc(text, func(match string) string {
// Convert to uppercase
code := strings.ToUpper(match)
// Pad with zeros if needed
if len(code) == 5 {
return code[:2] + "0" + code[2:]
}
return code
})
fmt.Println(result)
}
正则表达式匹配产品代码模式。该函数标准化大小写和格式。这展示了如何同时实现验证和规范化。
性能优化
对于复杂的替换,我们可以通过一次性编译正则表达式来优化。此示例展示了高效的多模式替换。
package main
import (
"fmt"
"regexp"
"strings"
)
func main() {
re := regexp.MustCompile(`\b(one|two|three)\b`)
text := "Count: one, two, three, four, five"
replacements := map[string]string{
"one": "1",
"two": "2",
"three": "3",
}
result := re.ReplaceAllStringFunc(text, func(match string) string {
return replacements[match]
})
fmt.Println(result)
}
正则表达式匹配数字单词。该函数使用映射表进行快速查找。此模式对于许多替换规则都非常高效。
来源
Go regexp.ReplaceAllStringFunc 文档
本教程通过使用实际示例介绍了 Go 中的 Regexp.ReplaceAllStringFunc 方法,演示了高级字符串替换。