go regexp 正则包 练习

package main  
/* 练习 regexp 包的使用 */
/* 里面的函数有点多,而且挺复杂的 ,之挑几个重要的说一下啊 */
import (
    "fmt"
    "regexp"
)


// 小试牛刀: 第一个例子
// 匹配指定类型的字符串
func common_regx(){

    str := "abcde  sbm"
    regx := regexp.MustCompile(`c.e`)
    if regx == nil{
        fmt.Printf("REGX COMPILE ERROR")
        return 
    }
    result := regx.FindAllStringSubmatch(str, -1)
    fmt.Printf("匹配到结果是 %v", result[0][0])
}

// Match  func Match(pattern string, b []byte) (matched bool, err error)
// slice b 是不是有匹配pattern  并不是py开头匹配的意思
func match(){
    is_match, err := regexp.Match("a.c", []byte("ccabcd,sb"))
    fmt.Printf("是不是匹配了 %v, 错误:%v", is_match, err)
    // > 是不是匹配了 true, 错误:<nil>
}


// MatchString  func MatchString(pattern string, s string) (matched bool, err error)
func match_string(){
    // 和 Match 不同的是,第二个参数是 string 而不是 byte 切片
    is_match, err := regexp.MatchString("(?i)ab.", "CCABCD, SBM")  // (?i) 是模式匹配的一种, py 里以已经看过了 
    fmt.Printf("%v, %v", is_match, err)
    // > true, <nil>

}

//  Regexp  
func regexp_struct(){
    // 这个暂时不知到撒意思?


}


// Compile func Compile(expr string) (*Regexp, error)
func compile(){
    // 这个也不太懂?


}

// MustCompile  func MustCompile(str string) *Regexp

func must_compile(){
    // 基本同Compile, 编译不成功好像是直接 panic

}

//  Copy func (re *Regexp) Copy() *Regexp
func copy(){
    // 拷贝一个 Regexp 对象,深copy

}

// Find  func (re *Regexp) Find(b []byte) []byte
func find(){
    // 返回左边的匹配结果
    regx := regexp.MustCompile(`SBM.?`)
    fmt.Printf("%c", regx.Find([]byte("aSBMN, SBMM")))
    // > "SBMN"   %c => [S B M N]

}

// FindAll  func (re *Regexp) FindAll(b []byte, n int) [][]byte
func findall(){
    // 返回 find 的切片组合
    regx := regexp.MustCompile(`SBM.?`)
    fmt.Printf("%q", regx.FindAll([]byte("aSBMN, SBMM"), -1))  // -1 只要小于0 ,就返回所有结果, >=0 则尽可能返回 这个数量的结果

    //> ["SBMN" "SBMM"]
}


// FindAllIndex   func (re *Regexp) FindAllIndex(b []byte, n int) [][]int
func FindAllIndex(){
    // 基本同 FindAll ,只不过 他返回的是索引位置
    content := []byte("London")
    re := regexp.MustCompile(`o.`)
    fmt.Println(re.FindAllIndex(content, 1))  // 1 的位置含义同 FindAll
    fmt.Println(re.FindAllIndex(content, -1))

    // > [[1 3]]
    //   [[1 3] [4 6]]

}


// FindAllString  func (re *Regexp) FindAllString(s string, n int) []string
func find_all_string(){
    // 同 FindAll , 只不过参数和返回值是 字符串而不是数组了
    regx := regexp.MustCompile("abc")
    fmt.Printf("%v", regx.FindAllString("abcfdfabc", -1))
    // > [abc abc]

}

// FindAllStringIndex  func (re *Regexp) FindAllStringIndex(s string, n int) [][]int
func find_all_string_index(){
    // 同 FindAllIndex 只不过参数是字符串,而不是 byte 数组了
    regx := regexp.MustCompile("abc")
    fmt.Printf("%v", regx.FindAllStringIndex("abcfdfabc", -1))
}

// FindIndex  func (re *Regexp) FindIndex(b []byte) (loc []int)
func find_index(){
    // FindAllIndex  单个匹配模式。
    // 参数是byte 切片哦。 找到第一个匹配的索引 开头:结尾 的一个切片
    regx := regexp.MustCompile("ab.")
    fmt.Printf("%v", regx.FindIndex([]byte ("abcdfdabc"))) 
    // > [0 3]
}


// FindString  func (re *Regexp) FindString(s string) string
func find_string(){
    // 类似 FindAllString  只不过只是 返回第一个匹配的 字符串

}

// FindStringIndex  func (re *Regexp) FindStringIndex(s string) (loc []int)
func find_string_index(){
    // 基本同 FindIndex 这里针对字符串


} 

// ReplaceAll  func (re *Regexp) ReplaceAll(src, repl []byte) []byte
func replace_all(){
    // 不会
}

// Split  func (re *Regexp) Split(s string, n int) []string
func split(){
    // 就是分割成 字符串的切片
    
}


func main(){
    // common_regx()
    // match()
    // match_string()
    // findall()
    // find_all_string()
    // find_all_string_index()
    find_index()

}

简单总结一下:
Find(All)?(String)?(Submatch)?(Index)? 这样记

  • All 表示获取所有匹配结果, 带有 All 的方法,会有 第二个参数num int, num >=0 尽可能返回 前num个匹配结果, <0 返回所有结果
  • String 表示参数是字符串,没有String 的参数默认是 字节数组 []byte
  • Submatch 表示捕获分组,返回的是切片 从左到右按左括号的顺序编号。 0为完整匹配的字串, 1 为第一个 左 ( 的匹配的东西。
  • Index 表示 返回 匹配的索引号
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354