正则表达式的语法可以说基本和编程语言无关,大同小异,不过就是调用的方法不同而已。
以一个案例总结下golang的正则常用方法。

注:
下面的regObj指regexp.Compile后的值,可理解为正则实例.
如果是js,就表示new Regexp或者/regexp/形式定义的正则实例

regexp.MatchString (测试是否匹配,类似js的regObj.test(str)方法)

sourceStr := `my email is gerrylon@163.com`
matched, _ := regexp.MatchString(`[\w-]+@[\w]+(?:\.[\w]+)+`, sourceStr)
fmt.Printf("%v", matched) // true

regObj.FindAllStringSubmatch (提取子分组, 类似js的str.match(regObj))

var sourceStr string = `
test text     lljflsdfjdskal
gerrylon@163.com
abc@gmail.com
someone@sina.com.cn`

re := regexp.MustCompile(`[\w-]+@([\w]+(?:\.[\w]+)+)`)
matched := re.FindAllStringSubmatch(sourceStr, -1)
for _, match := range matched {
    fmt.Printf("email is: %s, domain is: %s\n", match[0], match[1])
}

输出结果:

email is: gerrylon@163.com, domain is: 163.com
email is: abc@gmail.com, domain is: gmail.com
email is: someone@sina.com.cn, domain is: sina.com.cn

163.com

用js来实现一下上面的效果:

用str.match(regObj)实现

var sourceStr = `
    test text     lljflsdfjdskal
    gerrylon@163.com
    abc@gmail.com
    someone@sina.com.cn`;
var re = /[\w-]+@([\w]+(?:\.[\w]+)+)/g;
var result = sourceStr.match(re);

// ["gerrylon@163.com", "abc@gmail.com", "someone@sina.com.cn"]
// 注意这里没有输出子分组,也就是域名信息
console.log(result);

用regObj.exec(str)实现

// sourceStr 和 re和上边一样
var result = null;

// 输出和regObj.FindAllStringSubmatch实验结果一样
// email is: gerrylon@163.com, domain is: 163.com
// email is: abc@gmail.com, domain is: gmail.com
// email is: someone@sina.com.cn, domain is: sina.com.cn
while (result = re.exec(sourceStr)) {
    console.log("email is: %s, domain is: %s\n", result[0], result[1])
}

regObj.FindAllStringIndex (输出匹配串的起始结束索引)

regObj.FindAllStringSubmatch
var sourceStr string = `gerrylon@163.com, abc@gmail.com, someone@sina.com.cn`
re := regexp.MustCompile(`[\w-]+@([\w]+(?:\.[\w]+)+)`)
matched := re.FindAllStringIndex(sourceStr, -1)
for _, pos := range matched {
    fmt.Printf("start is: %v, end is: %v\n", pos[0], pos[1])
}

输出:

start is: 0, end is: 16
start is: 18, end is: 31
start is: 33, end is: 52

gerrylon@163.com

总结:
来源于godoc:
说是和正则相关的方法有16个,它们的名字可以用如下正则来表示(有没有感觉好好玩?)

Find(All)?(String)?(Submatch)?(Index)?
如果带有All,就找到所有的(和相关参数配合使用)
如果带有String,参数就是string, 否则就是slice of byte
如果带有Submatch,就能匹配分组
如果带有Index, 就以索引返回

瞬间明白了怎么用了,很好!