• golang正则regexp包使用-04-使用正则替换(ReplaceAll(),ReplaceAllLiteral(),ReplaceAllFunc())


    方法替换目标字串类型替换源字串类型返回值返回类型
    ReplaceAll()[ ]byte[ ]byte返回被替换后的字串[ ]byte
    ReplaceAllString()stringstring返回被替换后的字串string
    ReplaceAllLiteral()[ ]byte[ ]byte返回被替换后的字串[ ]byte
    ReplaceAllLiteralString()stringstring返回被替换后的字串string
    ReplaceAllFunc()[ ]bytefunc()返回被替换后的字串[ ]byte
    ReplaceAllStringFunc()stringfunc()返回被替换后的字串string

    1. 正则替换

    1.1 ReplaceAll() 方法

    语法

    func (re *Regexp) ReplaceAll(src []byte, repl []byte) []byte
    
    • 1

    完整示例

    • 代码
    package main
    
    import (
    	"fmt"
    	"regexp"
    )
    func main() {
    	reg := regexp.MustCompile("\\d+$")
    	myString := "10.10.239.11"
    	repl := "0/16"
    	s := reg.ReplaceAll([]byte(myString),[]byte(repl))
    	fmt.Printf("原字串:%q\n替换后:%q",myString,s)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 结果
    原字串:"10.10.239.11"
    替换后:"10.10.239.0/16"
    
    • 1
    • 2

    示例(使用分组 1)

    • 代码
    package main
    
    import (
    	"fmt"
    	"regexp"
    )
    
    func main() {
    	reg := regexp.MustCompile("(\\d.*\\.)\\d+")
    	myString := "10.10.239.11"
    	repl := "${1}0/16"
    	s := reg.ReplaceAll([]byte(myString),[]byte(repl))
    	fmt.Printf("原字串:%q\n替换后:%q",myString,s)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 结果
    原字串:"10.10.239.11"
    替换后:"10.10.239.0/16"
    
    • 1
    • 2

    示例(使用分组 2)

    package main
    
    import (
    	"fmt"
    	"regexp"
    )
    
    func main() {
    	reg := regexp.MustCompile("(.)(.)(.)(.)(.)(.)(.)")
    	myString := "柳庭风静人眠昼"
    	rep := []byte("${7}${6}${5}${4}${3}${2}${1}")
    	s := reg.ReplaceAll([]byte(myString),rep)
    	fmt.Printf("原字串:%q\n替换后:%q",myString,s)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 结果
    原字串:"柳庭风静人眠昼"
    替换后:"昼眠人静风庭柳"
    
    • 1
    • 2

    1.2 ReplaceAllString()

    语法

    func (re *Regexp) ReplaceAllString(src string, repl string) string
    
    • 1

    完整示例

    • 代码
    package main
    
    import (
    	"fmt"
    	"regexp"
    )
    func main() {
    	reg := regexp.MustCompile("\\d+$")
    	myString := "10.10.239.11"
    	repl := "0/16"
    	s := reg.ReplaceAllString(myString,repl)
    	fmt.Printf("原字串:%q\n替换后:%q",myString,s)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 结果
    原字串:"10.10.239.11"
    替换后:"10.10.239.0/16"
    
    • 1
    • 2

    2. 按原文替换

    2.1 ReplaceAllLiteral()

    “按原文的”说明rep中会按原文替换,即rep中的分组不会生效(我们将在“示例(按原文替换)”中演示。)

    语法

    func (re *Regexp) ReplaceAllLiteral(src []byte, repl []byte) []byte
    
    • 1

    完整示例

    package main
    
    import (
    	"fmt"
    	"regexp"
    )
    
    func main() {
    	reg := regexp.MustCompile("\\d+$")
    	myString := "10.10.239.11"
    	repl := "0/16"
    	s := reg.ReplaceAllLiteral([]byte(myString),[]byte(repl))
    	fmt.Printf("原字串:%q\n替换后:%q",myString,s)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 显示结果
    原字串:"10.10.239.11"
    替换后:"10.10.239.0/16"
    
    • 1
    • 2

    示例(按原文替换)

    • 代码
    package main
    
    import (
    	"fmt"
    	"regexp"
    )
    
    func main() {
    	reg := regexp.MustCompile("(\\d.*\\.)\\d+")
    	myString := "10.10.239.11"
    	repl := "${1}0/16"
    	s := reg.ReplaceAllLiteral([]byte(myString),[]byte(repl))
    	fmt.Printf("原字串:%q\n替换后:%q",myString,s)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 结果
    原字串:"10.10.239.11"
    替换后:"${1}0/16"
    
    • 1
    • 2

    如上可见,repl中的${1} 被原封不动的按字串替换了。

    2.2 ReplaceAllLiteralString()

    和ReplaceAllLiteral一样,repl中不可以使用分组的变量

    语法

    func (re *Regexp) ReplaceAllLiteralString(src string, repl string) string
    
    • 1

    完整示例

    package main
    
    import (
    	"fmt"
    	"regexp"
    )
    
    func main() {
    	//reg := regexp.MustCompile("(\\d.*\\.)\\d+")
    	reg := regexp.MustCompile("\\d+$")
    	myString := "10.10.239.11"
    	repl := "0/16"
    	s := reg.ReplaceAllLiteralString(myString,repl)
    	fmt.Printf("原字串:%q\n替换后:%q",myString,s)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 结果
    原字串:"10.10.239.11"
    替换后:"10.10.239.0/16"
    
    • 1
    • 2

    3. 函数处理替换源字串

    3.1 ReplaceAllFunc()

    语法

    func (re *Regexp) ReplaceAllFunc(src []byte, repl func([]byte) []byte) []byte
    
    • 1

    ReplaceAllFunc()方法,初始化实例已经包含了正则,只需要传入:原字串(src)、要替换的字串(repl)。
    repl是一个函数,传入值是正则匹配到的字串,传出一个经该函数处理过的值。

    完整示例

    • 代码
    package main
    
    import (
    	"fmt"
    	"regexp"
    )
    
    func main() {
    	reg := regexp.MustCompile("\\w+$")
    	myString := "www.xishu.com"
    	result := reg.ReplaceAllFunc([]byte(myString),getRepl)
    	fmt.Printf("最终替换结果:%s\n",result )
    }
    
    func getRepl(match []byte) []byte {
    	var rspl []byte
    	fmt.Printf("正则匹配结果:%s\n",match)
    	rspl = append(rspl,match...)
    	rspl = append(rspl,".cn"...)
    	return rspl
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 结果
    正则匹配结果:com
    最终替换结果:www.xishu.com.cn
    
    • 1
    • 2

    3.2 ReplaceAllStringFunc()

    语法

    func (re *Regexp) ReplaceAllStringFunc(src string, repl func(string) string) string
    
    • 1

    完整示例

    • 代码
    package main
    
    import (
    	"fmt"
    	"regexp"
    )
    
    func main() {
    	reg := regexp.MustCompile("\\w+$")
    	myString := "www.xishu.com"
    	//repl := "0/16
    	result := reg.ReplaceAllStringFunc(myString,getRepl)
    	fmt.Printf("最终替换结果:%s\n",result )
    }
    
    func getRepl(match string) string {
    	var rspl string
    	fmt.Printf("正则匹配结果:%s\n",match)
    	rspl = match + ".cn"
    	return rspl
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 结果
    正则匹配结果:com
    最终替换结果:www.xishu.com.cn
    
    • 1
    • 2
  • 相关阅读:
    Kafka-Kerberos票据刷新问题
    Rust Http 性能测试框架/工具
    Python进阶教学——装饰器与闭包
    「整合企业资源 壮大数字经济产业」成都市金牛区人大常委会“文半城”调研组莅临国际数字影像产业园考察调研
    使用CFimagehost源码搭建无需数据库支持的PHP免费图片托管私人图床
    界面组件DevExpress WPF v23.2新功能预览 - 更轻量级的主题
    整合视图层(Thymeleaf的使用)
    五、【视图】
    5G智能网关如何解决城市停车痛点难点
    【半监督学习】CNN与Transformer的结合
  • 原文地址:https://blog.csdn.net/xingzuo_1840/article/details/125353396