Golang Regex:反向引用

后端之巅 · · 1247 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

概述

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大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1247 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传