概述
Golang的regex包regexp使用的是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.
有疑问加站长微信联系(非本文作者)