Regular Expressions - 正则表达式

Go为[正则表达式]提供内置支持(http://en.wikipedia.org/wiki/Regular_expression)。这是Go中常见的正则表达式相关任务的一些示例。

  1. package main
  2. import "bytes"
  3. import "fmt"
  4. import "regexp"
  5. func main() {

这将测试模式是否与字符串匹配。

  1. match, _ := regexp.MatchString("p([a-z]+)ch", "peach")
  2. fmt.Println(match)

上面我们直接使用了一个字符串模式,但是对于其他正则表达式任务,你需要编译'优化的Regexp`结构。

  1. r, _ := regexp.Compile("p([a-z]+)ch")

这些结构有许多方法可供使用。这是我们之前看到的匹配测试。

  1. fmt.Println(r.MatchString("peach"))

这会找到正则表达式的匹配项。

  1. fmt.Println(r.FindString("peach punch"))

这也会找到第一个匹配但返回匹配的开始和结束索引而不是匹配文本。

  1. fmt.Println(r.FindStringIndex("peach punch"))

“Submatch”变体包括有关整个模式匹配的信息以及这些匹配中的子匹配。例如,这将返回’p([a-z] +)ch([a-z] +)`的信息。

  1. fmt.Println(r.FindStringSubmatch("peach punch"))

同样,这将返回有关匹配和子匹配的索引的信息。

  1. fmt.Println(r.FindStringSubmatchIndex("peach punch"))

这些函数的“All”变体适用于输入中的所有匹配,而不仅仅是第一个。例如,查找正则表达式的所有匹配项。

  1. fmt.Println(r.FindAllString("peach punch pinch", -1))

这些“All”变体也适用于我们上面看到的其他功能。

  1. fmt.Println(r.FindAllStringSubmatchIndex(
  2. "peach punch pinch", -1))

提供非负整数作为这些函数的第二个参数将限制匹配的数量。

  1. fmt.Println(r.FindAllString("peach punch pinch", 2))

我们上面的例子有字符串参数和用过的名字,比如MatchString。我们还可以提供[] byte参数并从函数名称中删除String

  1. fmt.Println(r.Match([]byte("peach")))

使用正则表达式创建常量时,可以使用CompileMustCompile变体。普通的“编译”对于常量不起作用,因为它有2个返回值。

  1. r = regexp.MustCompile("p([a-z]+)ch")
  2. fmt.Println(r)

regexp包也可用于替换其他值的字符串子集。

  1. fmt.Println(r.ReplaceAllString("a peach", "<fruit>"))

Func变体允许您使用给定函数转换matchedtext。

  1. in := []byte("a peach")
  2. out := r.ReplaceAllFunc(in, bytes.ToUpper)
  3. fmt.Println(string(out))
  4. }
  1. $ go run regular-expressions.go
  2. true
  3. true
  4. peach
  5. [0 5]
  6. [peach ea]
  7. [0 5 1 3]
  8. [peach punch pinch]
  9. [[0 5 1 3] [6 11 7 9] [12 17 13 15]]
  10. [peach punch]
  11. true
  12. p([a-z]+)ch
  13. a <fruit>
  14. a PEACH

有关Go正则表达式的完整参考,请查看[regexp](http://golang.org/pkg/regexp/)包文档。