Golang Regex:反向引用


本文摘自网络,作者,侵删。

概述

Golang的regex包regexp使用的是re2引擎,不支持反向引用。你可以在这里查看同样的情况

github.com/google/re2/…

它确实提到它不支持反向引用。

然而,有另一个golang包使用libpcre++,Perl regexes,它支持反向引用。

https://github.com/glenn-brown/golang-pkg-pcre/tree/master/src/pkg/pcre
复制代码

程序

所以让我们看看在golang中使用这个pcre包进行反向引用的例子。

第一个例子

假设我们想匹配一个数字的重复。有效的输入是

1111
888888888
444
复制代码

匹配相同的Regex将是

(\d)\1+
复制代码

让我们来剖析一下这个代码

  • (\d)- 匹配一个单一数字。单一数字被括在圆括号内,所以它作为一个捕获组。

  • \1- 通过捕获组反推第一个子匹配。所以它将引用第一个数字

  • +- 前一个数字的一个或多个出现的数字

相同的程序

package main

import (
	"fmt"

	"github.com/glenn-brown/golang-pkg-pcre/src/pkg/pcre"
)

func main() {
	regex := pcre.MustCompile(`(\d)\1+`, 0)

	matches := regex.MatcherString("1111", 0).Matches()
	fmt.Println("For 1111 : ", matches)

	matches = regex.MatcherString("88888888", 0).Matches()
	fmt.Println("For 88888888 : ", matches)

	matches = regex.MatcherString("444", 0).Matches()
	fmt.Println("For 444 : ", matches)

	matches = regex.MatcherString("123", 0).Matches()
	fmt.Println("For 123 : ", matches)
}
复制代码

输出

For 1111 :  true
For 88888888 :  true
For 444 :  true
For 123 :  false
复制代码

正如预期的那样,它对重复的数字给出了一个匹配。

1111
888888888
444
复制代码

而下面的数字不匹配,因为它不是一个重复的数字

123
复制代码

第二个例子

假设我们想匹配一个由冒号分隔的单词的重复。有效的输入是

John:John
The names are Simon:Simon
复制代码

匹配相同内容的Regex是

(\w+):\1
复制代码

让我们来剖析一下这个重组词

  • (\w+)- 匹配一个有多个字符的单词。它被括在圆括号内,所以它作为一个捕获组来使用。

  • \1- 通过捕获组反推第一个子匹配。所以它将引用匹配的单词

同样的程序

package main

import (
	"fmt"

	"github.com/glenn-brown/golang-pkg-pcre/src/pkg/pcre"
)

func main() {
	regex := pcre.MustCompile(`(\w+):\1`, 0)

	matches := regex.MatcherString("John:John", 0).Matches()
	fmt.Println("For John:John: ", matches)

	matches = regex.MatcherString("The names are Simon:Simon", 0).Matches()
	fmt.Println("For The names are Simon:Simon: ", matches)

	matches = regex.MatcherString("John:Simon", 0).Matches()
	fmt.Println("For John:Simon: ", matches)

}
复制代码

输出

For John:John:  true
For The names are Simon:Simon:  true
For John:Simon:  false
复制代码

正如预期的那样,它给出了一个包含有一个重复词的子串的匹配。

John:John
The names are Simon:Simon
复制代码

由于下面的字符串不包含重复的单词,所以它没有匹配。

John:Simon
复制代码

替换匹配的字符串

pcre包还提供了替换匹配字符串的功能。下面是一个相同的例子。

package main

import (
	"fmt"

	"github.com/glenn-brown/golang-pkg-pcre/src/pkg/pcre"
)

func main() {
	regex := pcre.MustCompile(`(\d)\1+`, 0)

	input := "The number is 91-88888888"

	result := regex.ReplaceAll([]byte(input), []byte("redacted"), 0)
	fmt.Println("result: ", string(result))
}
复制代码

输出

result:  The number is 91-redacted
复制代码

在上面的例子中,我们有一个带有反向参考的词条,匹配一个重复的数字。然后我们使用pcre包的ReplaceAll方法对这个重复的数字进行编辑。

result := regex.ReplaceAll([]byte(input), []byte("redacted"), 0)
复制代码

正如输出所预期的那样,重复的数字被正确地编辑了。

result:  The number is 91-redacted
复制代码

希望你喜欢这个教程。请在评论中分享反馈

另外,请查看我们的Golang高级教程系列--《Golang Regex:反向引用》。 Golang高级教程

The postGolang Regex: Backreferencesappeared first onWelcome To Golang By Example.


本文来自:掘金

感谢作者:后端之巅

查看原文:Golang Regex:反向引用

相关阅读 >>

Go map定义的几种方式以及修改技巧

聊聊dapr的fswatcher

Golang-匿名函数

使用 Go-randgen 测试 join 查询

Golang 无向简单图邻接多重表

Golang中如何正确地使用database/sql包访问数据库

分享Golang和vue3开发的一个im应用

Golang 笔记之深入浮点数

08 Golang引用类型——切片

钉钉 chatops demo

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...