Golang学习 - regexp 包

// 函数

// 判断在 b(s、r)中能否找到 pattern 所匹配的字符串
func Match(pattern string, b []byte) (matched bool, err error)
func MatchString(pattern string, s string) (matched bool, err error)
func MatchReader(pattern string, r io.RuneReader) (matched bool, err error)

// 将 s 中的正则表达式元字符转义成普通字符。
func QuoteMeta(s string) string

------------------------------

// 示例:MatchString、QuoteMeta
func main() {
	pat := `(((abc.)def.)ghi)`
	src := `abc-def-ghi abc+def+ghi`

	fmt.Println(regexp.MatchString(pat, src))
	// true <nil>

	fmt.Println(regexp.QuoteMeta(pat))
	// \(\(\(abc\.\)def\.\)ghi\)
}

------------------------------------------------------------

// Regexp 代表一个编译好的正则表达式,我们这里称之为正则对象。正则对象可以
// 在文本中查找匹配的内容。
//
// Regexp 可以安全的在多个例程中并行使用。
type Regexp struct { ... }

------------------------------

// 编译

// 将正则表达式编译成一个正则对象(使用 PERL 语法)。
// 该正则对象会采用“leftmost-first”模式。选择第一个匹配结果。
// 如果正则表达式语法错误,则返回错误信息。
func Compile(expr string) (*Regexp, error)

// 将正则表达式编译成一个正则对象(正则语法限制在 POSIX ERE 范围内)。
// 该正则对象会采用“leftmost-longest”模式。选择最长的匹配结果。
// POSIX 语法不支持 Perl 的语法格式:\d、\D、\s、\S、\w、\W
// 如果正则表达式语法错误,则返回错误信息。
func CompilePOSIX(expr string) (*Regexp, error)

// 功能同上,但会在解析失败时 panic
func MustCompile(str string) *Regexp
func MustCompilePOSIX(str string) *Regexp

// 让正则表达式在之后的搜索中都采用“leftmost-longest”模式。
func (re *Regexp) Longest()

// 返回编译时使用的正则表达式字符串
func (re *Regexp) String() string

// 返回正则表达式中分组的数量
func (re *Regexp) NumSubexp() int

// 返回正则表达式中分组的名字
// 第 0 个元素表示整个正则表达式的名字,永远是空字符串。
func (re *Regexp) SubexpNames() []string

// 返回正则表达式必须匹配到的字面前缀(不包含可变部分)。
// 如果整个正则表达式都是字面值,则 complete 返回 true。
func (re *Regexp) LiteralPrefix() (prefix string, complete bool)

------------------------------

// 示例:第一匹配和最长匹配
func main() {
	b := []byte("abc1def1")
	pat := `abc1|abc1def1`
	reg1 := regexp.MustCompile(pat)      // 第一匹配
	reg2 := regexp.MustCompilePOSIX(pat) // 最长匹配
	fmt.Printf("%s\n", reg1.Find(b))     // abc1
	fmt.Printf("%s\n", reg2.Find(b))     // abc1def1

	b = []byte("abc1def1")
	pat = `(abc|abc1def)*1`
	reg1 = regexp.MustCompile(pat)      // 第一匹配
	reg2 = regexp.MustCompilePOSIX(pat) // 最长匹配
	fmt.Printf("%s\n", reg1.Find(b))    // abc1
	fmt.Printf("%s\n", reg2.Find(b))    // abc1def1
}

------------------------------

// 示例:正则信息
func main() {
	pat := `(abc)(def)(ghi)`
	reg := regexp.MustCompile(pat)

	// 获取正则表达式字符串
	fmt.Println(reg.String())    // (abc)(def)(ghi)

	// 获取分组数量
	fmt.Println(reg.NumSubexp()) // 3

	fmt.Println()

	// 获取分组名称
	pat = `(?P<Name1>abc)(def)(?P<Name3>ghi)`
	reg = regexp.MustCompile(pat)

	for i := 0; i <= reg.NumSubexp(); i++ {
		fmt.Printf("%d: %q\n", i, reg.SubexpNames()[i])
	}
	// 0: ""
	// 1: "Name1"
	// 2: ""
	// 3: "Name3"

	fmt.Println()

	// 获取字面前缀
	pat = `(abc1)(abc2)(abc3)`
	reg = regexp.MustCompile(pat)
	fmt.Println(reg.LiteralPrefix()) // abc1abc2abc3 true

	pat = `(abc1)|(abc2)|(abc3)`
	reg = regexp.MustCompile(pat)
	fmt.Println(reg.LiteralPrefix()) //  false

	pat = `abc1|abc2|abc3`
	reg = regexp.MustCompile(pat)
	fmt.Println(reg.LiteralPrefix()) // abc false
}

------------------------------

// 判断

// 判断在 b(s、r)中能否找到匹配的字符串
func (re *Regexp) Match(b []byte) bool
func (re *Regexp) MatchString(s string) bool
func (re *Regexp) MatchReader(r io.RuneReader) bool

------------------------------

// 查找

// 返回第一个匹配到的结果(结果以 b 的切片形式返回)。
func (re *Regexp) Find(b []byte) []byte

// 返回第一个匹配到的结果及其分组内容(结果以 b 的切片形式返回)。
// 返回值中的第 0 个元素是整个正则表达式的匹配结果,后续元素是各个分组的
// 匹配内容,分组顺序按照“(”的出现次序而定。
func (re *Regexp) FindSubmatch(b []byte) [][]byte

// 功能同 Find,只不过返回的是匹配结果的首尾下标,通过这些下标可以生成切片。
// loc[0] 是结果切片的起始下标,loc[1] 是结果切片的结束下标。
func (re *Regexp) FindIndex(b []byte) (loc []int)

// 功能同 FindSubmatch,只不过返回的是匹配结果的首尾下标,通过这些下标可以生成切片。
// loc[0] 是结果切片的起始下标,loc[1] 是结果切片的结束下标。
// loc[2] 是分组1切片的起始下标,loc[3] 是分组1切片的结束下标。
// loc[4] 是分组2切片的起始下标,loc[5] 是分组2切片的结束下标。
// 以此类推
func (re *Regexp) FindSubmatchIndex(b []byte) (loc []int)

------------------------------

// 示例:Find、FindSubmatch
func main() {
	pat := `(((abc.)def.)ghi)`
	reg := regexp.MustCompile(pat)

	src := []byte(`abc-def-ghi abc+def+ghi`)

	// 查找第一个匹配结果
	fmt.Printf("%s\n", reg.Find(src)) // abc-def-ghi

	fmt.Println()

	// 查找第一个匹配结果及其分组字符串
	first := reg.FindSubmatch(src)
	for i := 0; i < len(first); i++ {
		fmt.Printf("%d: %s\n", i, first[i])
	}
	// 0: abc-def-ghi
	// 1: abc-def-ghi
	// 2: abc-def-
	// 3: abc-
}

------------------------------

// 示例:FindIndex、FindSubmatchIndex
func main() {
	pat := `(((abc.)def.)ghi)`
	reg := regexp.MustCompile(pat)

	src := []byte(`abc-def-ghi abc+def+ghi`)

	// 查找第一个匹配结果
	matched := reg.FindIndex(src)
	fmt.Printf("%v\n", matched) // [0 11]
	m := matched[0]
	n := matched[1]
	fmt.Printf("%s\n\n", src[m:n]) // abc-def-ghi

	// 查找第一个匹配结果及其分组字符串
	matched = reg.FindSubmatchIndex(src)
	fmt.Printf("%v\n", matched) // [0 11 0 11 0 8 0 4]
	for i := 0; i < len(matched)/2; i++ {
		m := matched[i*2]
		n := matched[i*2+1]
		fmt.Printf("%s\n", src[m:n])
	}
	// abc-def-ghi
	// abc-def-ghi
	// abc-def-
	// abc-
}

------------------------------

// 功能同上,只不过返回多个匹配的结果,而不只是第一个。
// n 是查找次数,负数表示不限次数。
func (re *Regexp) FindAll(b []byte, n int) [][]byte
func (re *Regexp) FindAllSubmatch(b []byte, n int) [][][]byte

func (re *Regexp) FindAllIndex(b []byte, n int) [][]int
func (re *Regexp) FindAllSubmatchIndex(b []byte, n int) [][]int

------------------------------

// 示例:FindAll、FindAllSubmatch
func main() {
	pat := `(((abc.)def.)ghi)`
	reg := regexp.MustCompile(pat)

	s := []byte(`abc-def-ghi abc+def+ghi`)

	// 查找所有匹配结果
	for _, one := range reg.FindAll(s, -1) {
		fmt.Printf("%s\n", one)
	}
	// abc-def-ghi
	// abc+def+ghi

	// 查找所有匹配结果及其分组字符串
	all := reg.FindAllSubmatch(s, -1)
	for i := 0; i < len(all); i++ {
		fmt.Println()
		one := all[i]
		for i := 0; i < len(one); i++ {
			fmt.Printf("%d: %s\n", i, one[i])
		}
	}
	// 0: abc-def-ghi
	// 1: abc-def-ghi
	// 2: abc-def-
	// 3: abc-

	// 0: abc+def+ghi
	// 1: abc+def+ghi
	// 2: abc+def+
	// 3: abc+
}

------------------------------

// 功能同上,只不过在字符串中查找
func (re *Regexp) FindString(s string) string
func (re *Regexp) FindStringSubmatch(s string) []string

func (re *Regexp) FindStringIndex(s string) (loc []int)
func (re *Regexp) FindStringSubmatchIndex(s string) []int

func (re *Regexp) FindAllString(s string, n int) []string
func (re *Regexp) FindAllStringSubmatch(s string, n int) [][]string

func (re *Regexp) FindAllStringIndex(s string, n int) [][]int
func (re *Regexp) FindAllStringSubmatchIndex(s string, n int) [][]int

// 功能同上,只不过在 io.RuneReader 中查找。
func (re *Regexp) FindReaderIndex(r io.RuneReader) (loc []int)
func (re *Regexp) FindReaderSubmatchIndex(r io.RuneReader) []int

------------------------------

// 替换(不会修改参数,结果是参数的副本)

// 将 src 中匹配的内容替换为 repl(repl 中可以使用 $1 $name 等分组引用符)。
func (re *Regexp) ReplaceAll(src, repl []byte) []byte

// 将 src 中匹配的内容经过 repl 函数处理后替换回去。
func (re *Regexp) ReplaceAllFunc(src []byte, repl func([]byte) []byte) []byte

// 将 src 中匹配的内容替换为 repl(repl 为字面值,不解析其中的 $1 $name 等)。
func (re *Regexp) ReplaceAllLiteral(src, repl []byte) []byte

// 功能同上,只不过在字符串中查找。
func (re *Regexp) ReplaceAllString(src, repl string) string
func (re *Regexp) ReplaceAllStringFunc(src string, repl func(string) string) string
func (re *Regexp) ReplaceAllLiteralString(src, repl string) string

// Expand 要配合 FindSubmatchIndex 一起使用。FindSubmatchIndex 在 src 中进行
// 查找,将结果存入 match 中。这样就可以通过 src 和 match 得到匹配的字符串。
// template 是替换内容,可以使用分组引用符 $1、$2、$name 等。Expane 将其中的分
// 组引用符替换为前面匹配到的字符串。然后追加到 dst 的尾部(dst 可以为空)。
// 说白了 Expand 就是一次替换过程,只不过需要 FindSubmatchIndex 的配合。
func (re *Regexp) Expand(dst []byte, template []byte, src []byte, match []int) []byte

// 功能同上,参数为字符串。
func (re *Regexp) ExpandString(dst []byte, template string, src string, match []int) []byte

------------------------------

// 示例:Expand
func main() {
	pat := `(((abc.)def.)ghi)`
	reg := regexp.MustCompile(pat)

	src := []byte(`abc-def-ghi abc+def+ghi`)
	template := []byte(`$0   $1   $2   $3`)

	// 替换第一次匹配结果
	match := reg.FindSubmatchIndex(src)
	fmt.Printf("%v\n", match) // [0 11 0 11 0 8 0 4]
	dst := reg.Expand(nil, template, src, match)
	fmt.Printf("%s\n\n", dst)
	// abc-def-ghi   abc-def-ghi   abc-def-   abc-

	// 替换所有匹配结果
	for _, match := range reg.FindAllSubmatchIndex(src, -1) {
		fmt.Printf("%v\n", match)
		dst := reg.Expand(nil, template, src, match)
		fmt.Printf("%s\n", dst)
	}
	// [0 11 0 11 0 8 0 4]
	// abc-def-ghi   abc-def-ghi   abc-def-   abc-
	// [12 23 12 23 12 20 12 16]
	// abc+def+ghi   abc+def+ghi   abc+def+   abc+
}

------------------------------

// 其它

// 以 s 中的匹配结果作为分割符将 s 分割成字符串列表。
// n 是分割次数,负数表示不限次数。
func (re *Regexp) Split(s string, n int) []string

// 将当前正则对象复制一份。在多例程中使用同一正则对象时,给每个例程分配一个
// 正则对象的副本,可以避免多例程对单个正则对象的争夺锁定。
func (re *Regexp) Copy() *Regexp

------------------------------------------------------------

原文地址:https://www.cnblogs.com/yaowen/p/8335286.html

时间: 2024-08-28 02:12:41

Golang学习 - regexp 包的相关文章

Golang学习 - builtin 包

Go builtin包提供了go预先声明的函数.变量等的文档.这些函数变量等的实现其实并不是在builtin包里,只是为了方便文档组织. 这些内置的变量.函数.类型无需引入包即可使用. 默认提供的有: 1.常量: true,false,iota 关于iota,请参考周一的文章"go iota用法" 2.变量 nil 3.函数 func append(slice []Type, elems ...Type) []Type 向slice中添加元素 func cap(v Type) int

Golang学习 - unsafe 包

------------------------------------------------------------ 指针类型: *类型:普通指针,用于传递对象地址,不能进行指针运算. unsafe.Pointer:通用指针类型,用于转换不同类型的指针,不能进行指针运算. uintptr:用于指针运算,GC 不把 uintptr 当指针,uintptr 无法持有对象.uintptr 类型的目标会被回收. unsafe.Pointer 可以和 普通指针 进行相互转换. unsafe.Point

Golang学习 - errors 包

------------------------------------------------------------ Go 语言使用 error 类型来返回函数执行过程中遇到的错误,如果返回的 error 值为 nil,则表示未遇到错误,否则 error 会返回一个字符串,用于说明遇到了什么错误. 其实 error 只是一个接口,定义如下: ------------------------------------------------------------ type error inte

Golang学习 - sync 包

------------------------------------------------------------ 临时对象池 Pool 用于存储临时对象,它将使用完毕的对象存入对象池中,在需要的时候取出来重复使用,目的是为了避免重复创建相同的对象造成 GC 负担过重.其中存放的临时对象随时可能被 GC 回收掉(如果该对象不再被其它变量引用). 从 Pool 中取出对象时,如果 Pool 中没有对象,将返回 nil,但是如果给 Pool.New 字段指定了一个函数的话,Pool 将使用该函

Golang学习 - strconv 包--数据类型转换

// 将布尔值转换为字符串 true 或 false func FormatBool(b bool) string // 将字符串转换为布尔值 // 它接受真值:1, t, T, TRUE, true, True // 它接受假值:0, f, F, FALSE, false, False // 其它任何值都返回一个错误. func ParseBool(str string) (bool, error) ------------------------------ // ErrRange 表示值超

Golang学习笔记--log包

个人站:http://www.cloudnoter.com/?p=137 一.快速使用 Golang的log包短小精悍,可以非常轻松的实现日志打印转存功能.不用多说,log支持并发操作(即协程安全-相对于JAVA中的线程安全而言),其结构定义如下: type Logger struct { mu sync.Mutex // ensures atomic writes; protects the following fields prefix string // prefix to write a

Golang学习--包管理工具glide

上一篇文章中我们已经成功的运行了go的代码,这是我们迈出的最基础的一步. 一个项目通常会依赖很多外部的库,当依赖的库比较多的时候,手工管理就会比较麻烦,这个时候就需要包管理工具出场了,帮你管理好所有依赖的库. php项目中使用composer,javascript项目中使用npm,那么在go项目中,我们需要使用什么? 包依赖工具的选择 当前go的包管理工具有glide.godep.govendor和gvt等,相关对比的文章可以查看<go依赖包管理工具对比>. 功能对比可以参考如下内容(虽然跟上

【golang学习】环境搭建

近期项目的需要开始了学习golang的旅程,在此将学习的过程做以记录,方便查看,也希望帮助到大家. 由于我使用的是64位linux环境(redhat 5.2),所以这里就介绍64位的安装方式,其他类似: 1. 下载安装包 自从2014年5月谷歌在国内被封杀之后,我们下载go安装包也得翻墙了,但是为了方便我上传了一个64位linux的包在(地址),你可以直接下载使用. 2.安装 下载完上传到你的linux系统中,比如/opt/go1.1.1.linux-amd64.tar.gz,这是就开始安装了,

golang的sync包例子

package main import ( "fmt" "sync" ) var wg sync.WaitGroup func asyncTestFunc() { for i := 0; i < 100; i++ { fmt.Println(i) } wg.Done() } func main() { wg.Add(1) go asyncTestFunc() wg.Wait() } golang的sync包例子