go标准库01 正则表达式(regexp包)

2017-09-07 16:03:11

我将从正则表达式开始讲Go的标准库。正则表达式是文字处理中常用的工具,而且不需要额外的系统知识或经验。我们会把系统相关的包放在后面讲解。
正则表达式(regular expression)主要功能是从字符串(string)中通过特定的模式(pattern),搜索想要找到的内容。

语法

regexp包实现了正则表达式搜索。
正则表达式采用RE2语法(除了\c、\C),和Perl、Python等语言的正则基本一致
在go中使用正则表达式需要标准库中的一个包regexp

func Match(pattern string, b []byte) (matched bool, err error)
Match检查b中是否存在匹配pattern的子序列

1
2
3
4
5
6
7
8
9
10
11
package main
import (
"regexp"
"fmt"
)
func main() {
fmt.Println(regexp.Match("[0-9] ", []byte("abcd5ef")))
}

[tiger@bogon go]$ go run reg.go
false <nil>

如果你熟悉Linux或者Perl, 你应该已经熟悉正则表达式。当我们打开Linux shell的时候,可以用正则表达式去查找或着删除我们想要的文件,比如说:
$rm log[0-9][0-9].txt
这就是要删除类似于log02.txt的文件。log[0-9][0-9].txt所包含的信息是,以log开头,后面跟两个数字字符,之后跟有”.txt”的文件名。如果不符合条件的文件名,比如说:
log12.txt
log1.txt
log99.text
都不会被选中。
Perl中内建有正则表达式的功能,据说是所有正则表达式系统中最强的,这也是Perl成为系统管理员利器的一个原因。

正则表达式的函数
1
2
func (re *Regexp) FindString(s string) string   //搜索整个字符串,直到发现符合的子字符串
func (re *Regexp) MatchString(s string) bool //MatchString类似Match,但匹配对象是字符串。

可以从这两个函数中选择一个进行搜索。上面的例子中,我们如果使用regexp.MatchString()的话,则会得到False,因为字符串的起始为‘a’, 不符合’[0-9]’的要求。

我们还可以在搜索之后将搜索到的子字符串进行替换:

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

Find返回一个保管正则表达式re在b中的所有不重叠的匹配结果及其对应的(可能有的)分组匹配的结果的[][]string切片。如果没有匹配到,会返回nil。

此外,常用的正则表达式函数还有

func (re *Regexp) Split(s string, n int) []string
Split将re在s中匹配到的结果作为分隔符将s分割成多个字符串,并返回这些正则匹配结果之间的字符串的切片。

func (re *Regexp) FindAllString(s string, n int) []string
Find返回保管正则表达式re在b中的所有不重叠的匹配结果的[]string切片。如果没有匹配到,会返回nil。

写一个正则表达式

关键在于将信息写成一个正则表达式。我们先看正则表达式的常用语法

  • 单个字符

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    .          任意的一个字符
    a|b 字符a或字符b
    [afg] a或者f或者g的一个字符
    [0-4] 0-4范围内的一个字符
    [a-f] a-f范围内的一个字符
    [^m] 不是m的一个字符
    \s 一个空格
    \S 一个非空格
    \d [0-9]
    \D [^0-9]
    \w [0-9a-zA-Z]
    \W [^0-9a-zA-Z]
  • 重复
    紧跟在单个字符之后,表示多个这样类似的字符

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    *         重复 >=0 次
    + 重复 >=1 次
    ? 重复 0或者1 次
    {m} 重复m次。比如说 a{4}相当于aaaa,再比如说[1-3]{2}相当于[1-3][1-3]
    {m, n} 重复m到n次。比如说a{2, 5}表示a重复2到5次。小于m次的重复,或者大于n次的重复都不符合条件。

    正则表达 相符的字符串举例
    [0-9]{3,5} 9678
    a?b b
    a+b aaaaab
  • 位置

    1
    2
    3
    4
    5
    ^         字符串的起始位置
    $ 字符串的结尾位置

    正则表达 相符的字符串举例 不相符字符串
    ^ab.*c$ abeec cabeec

您的鼓励是我写作最大的动力

俗话说,投资效率是最好的投资。 如果您感觉我的文章质量不错,读后收获很大,预计能为您提高 10% 的工作效率,不妨小额捐助我一下,让我有动力继续写出更多好文章。