Go语言字符串和正则表达式
字符串相关方法
package main import "fmt" func main() { ??? str1 := "lnj" ??? fmt.Println(len(str1)) // 3 ??? str2 := "lnj" ??? fmt.Println(len(str2)) // 12 }
package main import "fmt" func main() { ??? str := "lnj" ??? // 注意byte占1个字节,只能保存字符不能保存汉字,因为一个汉字占用3个字节 ??? arr1 := []byte(str) // 12 ??? fmt.Println(len(arr1)) ??? for _,v := range arr1{ ??????? fmt.Printf("%c",v)? ??? } ? ??? // Go语言中rune类型就是专门用于保存汉字的 ??? arr2 := []rune(str) ??? fmt.Println(len(arr2)) // 6 ??? for _,v := range arr2{ ??????? fmt.Printf("%c",v) // lnj ??? } }
package main import ( ??? "strings" ??? "fmt" ) func main() { ??? // 查找`字符`在字符串中第一次出现的位置,找不到返回-1 ??? res := strings.IndexByte("hello",‘l‘) ??? fmt.Println(res) // 2 ? ??? // 查找`汉字`OR`字符`在字符串中第一次出现的位置,找不到返回-1 ??? res = strings.IndexRune("hello",‘l‘) ??? fmt.Println(res) // 6 ??? res = strings.IndexRune("hello",‘l‘) ??? fmt.Println(res) // 2 ? ??? // 查找`汉字`OR`字符`中任意一个在字符串中第一次出现的位置,找不到返回-1 ??? res = strings.IndexAny("hello","wml") ??? fmt.Println(res) // 2 ??? // 会把wmhl拆开逐个查找,w、m、h、l只要任意一个被找到,立刻停止查找 ??? res = strings.IndexAny("hello","wmhl") ??? fmt.Println(res) // 0 ??? // 查找`子串`在字符串第一次出现的位置,找不到返回-1 ??? res = strings.Index("hello 李南江","llo") ??? fmt.Println(res) // 2 ??? // 会把lle当做一个整体去查找,而不是拆开 ??? res = strings.Index("hello","lle") ??? fmt.Println(res) // -1 ??? // 可以查找字符也可以查找汉字 ??? res = strings.Index("hello","l") ??? fmt.Println(res) // 6 ? ??? // 会将字符串先转换为[]rune,然后遍历rune切片逐个取出传给自定义函数 ??? // 只要函数返回true,代表符合我们的需求,既立即停止查找 ??? res = strings.IndexFunc("hello 李南江",custom) ??? fmt.Println(res) // 6 ? ??? // 倒序查找`子串`在字符串第一次出现的位置,找不到返回-1 ??? res := strings.LastIndex("hello ","l") ??? fmt.Println(res) // 3 } func custom(r rune) bool { ??? fmt.Printf("被调用了,当前传入的是%cn",r) ??? if r == ‘o‘ { ??????? return true ??? } ??? return false }
package main import ( ??? "strings" ??? "fmt" ) func main() { ??? // 查找`子串`在字符串中是否存在,存在返回true,不存在返回false ??? // 底层实现就是调用strings.Index函数 ??? res := strings.Contains( "hello","llo") ??? fmt.Println(res) // true ? ??? // 查找`汉字`OR`字符`在字符串中是否存在,不存在返回false ??? // 底层实现就是调用strings.IndexRune函数 ??? res = strings.ContainsRune( "hello",‘l‘) ??? fmt.Println(res) // true ??? res = strings.ContainsRune( "hello",‘l‘) ??? fmt.Println(res) // true ? ??? // 查找`汉字`OR`字符`中任意一个在字符串中是否存在,不存在返回false ??? // 底层实现就是调用strings.IndexAny函数 ??? res = strings.ContainsAny( "hello","wmhl") ??? fmt.Println(res) // true ? ??? // 判断字符串是否已某个字符串开头 ??? res = strings.HasPrefix("lnj-book.avi","lnj") ??? fmt.Println(res) // true ? ??? // 判断字符串是否已某个字符串结尾 ??? res = strings.HasSuffix("lnj-book.avi",".avi") ??? fmt.Println(res) // true }
package main import ( ??? "strings" ??? "fmt" ) func main() { ??? // 比较两个字符串大小,会逐个字符地进行比较ASCII值 ??? // 第一个参数 >? 第二个参数 返回 1 ??? // 第一个参数 <? 第二个参数 返回 -1 ??? // 第一个参数 == 第二个参数 返回 0 ??? res := strings.Compare("bcd","abc") ??? fmt.Println(res) // 1 ??? res = strings.Compare("bcd","bdc") ??? fmt.Println(res) // -1 ??? res = strings.Compare("bcd","bcd") ??? fmt.Println(res) // 0 ? ??? // 判断两个字符串是否相等,可以判断字符和中文 ??? // 判断时会忽略大小写进行判断 ??? res2 := strings.EqualFold("abc","def") ??? fmt.Println(res2) // false ??? res2 = strings.EqualFold("abc","abc") ??? fmt.Println(res2) // true ??? res2 = strings.EqualFold("abc","ABC") ??? fmt.Println(res2) // true ??? res2 = strings.EqualFold("111","111") ??? fmt.Println(res2) // true }
package main import ( ??? "strings" ??? "fmt" ) func main() { ??? // 将字符串转换为小写 ??? res := strings.ToLower("ABC") ??? fmt.Println(res) // abc ??? ??? // 将字符串转换为大写 ??? res = strings.ToUpper("abc") ??? fmt.Println(res) // ABC ? ??? // 将字符串转换为标题格式,大部分`字符`标题格式就是大写 ??? res = strings.ToTitle("hello world") ??? fmt.Println(res) // HELLO WORLD ??? res = strings.ToTitle("HELLO WORLD") ??? fmt.Println(res) // HELLO WORLD ? ??? // 将单词首字母变为大写,其它字符不变 ??? // 单词之间用空格OR特殊字符隔开 ??? res = strings.Title("hello world") ??? fmt.Println(res) // Hello World }
package main import ( ??? "strings" ??? "fmt" ) func main() { ??? // 按照指定字符串切割原字符串 ??? // 用,切割字符串 ??? arr1 := strings.Split("a,b,c",",") ??? fmt.Println(arr1) // [a b c] ??? arr2 := strings.Split("ambmc","m") ??? fmt.Println(arr2) // [a b c] ? ??? // 按照指定字符串切割原字符串,并且指定切割为几份 ??? // 如果最后一个参数为0,那么会范围一个空数组 ??? arr3 := strings.SplitN("a,2) ??? fmt.Println(arr3) // [a b,c] ??? arr4 := strings.SplitN("a,0) ??? fmt.Println(arr4) // [] ? ??? // 按照指定字符串切割原字符串,切割时包含指定字符串 ??? arr5 := strings.SplitAfter("a,") ??? fmt.Println(arr5) // [a,c] ? ??? // 按照指定字符串切割原字符串,切割时包含指定字符串,并且指定切割为几份 ??? arr6 := strings.SplitAfterN("a,2) ??? fmt.Println(arr6) // [a,c] ? ??? // 按照空格切割字符串,多个空格会合并为一个空格处理 ??? arr7 := strings.Fields("a? b c??? d") ??? fmt.Println(arr7) // [a b c d] ? ??? // 将字符串转换成切片传递给函数之后由函数决定如何切割 ??? // 类似于IndexFunc ??? arr8 := strings.FieldsFunc("a,custom) ??? fmt.Println(arr8) // [a b c] ? ??? // 将字符串切片按照指定连接符号转换为字符串 ??? sce := []string{"aa","bb","cc"} ??? str1 := strings.Join(sce,"-") ??? fmt.Println(str1) // aa-bb-cc ? ? ??? // 返回count个s串联的指定字符串 ??? str2 := strings.Repeat("abc",2) ??? fmt.Println(str2) // abcabc ? ??? // 第一个参数: 需要替换的字符串 ??? // 第二个参数: 旧字符串 ??? // 第三个参数: 新字符串 ??? // 第四个参数: 用新字符串 替换 多少个旧字符串 ??? // 注意点: 传入-1代表只要有旧字符串就替换 ??? // 注意点: 替换之后会生成新字符串,原字符串不会受到影响 ??? str3 := "abcdefabcdefabc" ??? str4 := strings.Replace(str3,"abc","mmm",-1) ??? fmt.Println(str3) // abcdefabcdefabc ??? fmt.Println(str4) // mmmdefmmmdefmmm } func custom(r rune) bool { ??? fmt.Printf("被调用了,r) ??? if r == ‘,‘ { ??????? return true ??? } ??? return false }
package main import ( ??? "strings" ??? "fmt" ) func main() { ??? // 去除字符串两端指定字符 ??? str1 := strings.Trim("!!!abc!!!def!!!","!") ??? fmt.Println(str1) // abc!!!def ??? // 去除字符串左端指定字符 ??? str2 := strings.TrimLeft("!!!abc!!!def!!!","!") ??? fmt.Println(str2) // abc!!!def!!! ??? // 去除字符串右端指定字符 ??? str3 := strings.TrimRight("!!!abc!!!def!!!","!") ??? fmt.Println(str3) // !!!abc!!!def ??? // // 去除字符串两端空格 ??? str4 := strings.TrimSpace("?? abc!!!def ") ??? fmt.Println(str4) // abc!!!def ? ??? // 按照方法定义规则,去除字符串两端符合规则内容 ??? str5 := strings.TrimFunc("!!!abc!!!def!!!",custom) ??? fmt.Println(str5) // abc!!!def ??? // 按照方法定义规则,去除字符串左端符合规则内容 ??? str6 := strings.TrimLeftFunc("!!!abc!!!def!!!",custom) ??? fmt.Println(str6) // abc!!!def!!! ??? //? 按照方法定义规则,去除字符串右端符合规则内容 ??? str7 := strings.TrimRightFunc("!!!abc!!!def!!!",custom) ??? fmt.Println(str7) // !!!abc!!!def ? ??? // 取出字符串开头的指定字符串 ??? str8 := strings.TrimPrefix("lnj-book.avi","lnj-") ??? fmt.Println(str8) // book.avi ? ??? // 取出字符串结尾的指定字符串 ??? str9 := strings.TrimSuffix("lnj-book.avi",".avi") ??? fmt.Println(str9) // lnj-book } 正则表达式
package main import ( ??? "strings" ??? "fmt" ) func main() { ??? // 创建一个正则表达式匹配规则对象 ??? // reg := regexp.MustCompile(规则字符串) ??? // 利用正则表达式匹配规则对象匹配指定字符串 ??? // 会将所有匹配到的数据放到一个字符串切片中返回 ??? // 如果没有匹配到数据会返回nil ??? // res := reg.FindAllString(需要匹配的字符串,匹配多少个) ? ??? str := "Hello 1232" ??? reg := regexp.MustCompile("2") ?? ?res := reg.FindAllString(str,-1) ??? fmt.Println(res) // [2 2] ??? res = reg.FindAllString(str,1) ??? fmt.Println(res) // [2] }
package main import ( ??? "strings" ??? "fmt" ) func main() { ??? res2 := findPhoneNumber("13554499311") ??? fmt.Println(res2) // true ? ??? res2 = findPhoneNumber("03554499311") ??? fmt.Println(res2) // false ? ??? res2 = findPhoneNumber("1355449931") ??? fmt.Println(res2) // false } func findPhoneNumber(str string) bool { ??? // 创建一个正则表达式匹配规则对象 ??? reg := regexp.MustCompile("^1[1-9]{10}") ??? // 利用正则表达式匹配规则对象匹配指定字符串 ??? res := reg.FindAllString(str,-1) ??? if(res == nil){ ??????? return? false ??? } ??? return? true }
package main import ( ??? "strings" ??? "fmt" ) func main() { ??? res2 = findEmail("[email?protected]") ??? fmt.Println(res2) // true ? ??? res2 = findEmail("[email?protected]") ??? fmt.Println(res2) // false ? ??? res2 = findEmail("[email?protected]") ??? fmt.Println(res2) // false } func findEmail(str string) bool { ??? reg := regexp.MustCompile("^[a-zA-Z0-9_][email?protected][a-zA-Z0-9]+.[a-zA-Z0-9]+") ??? res := reg.FindAllString(str,-1) ??? if(res == nil){ ??????? return? false ??? } ??? return? true } 时间和日期函数
package main ? import ( ??? "fmt" ??? "time" ) func main()? { ??? var t time.Time = time.Now() ??? // 2018-09-27 17:25:11.653198 +0800 CST m=+0.009759201 ??? fmt.Println(t) }
package main ? import ( ??? "fmt" ??? "time" ) func main()? { ??? var t time.Time = time.Now() ??? fmt.Println(t.Year()) ??? fmt.Println(t.Month()) ??? fmt.Println(t.Day()) ??? fmt.Println(t.Hour()) ??? fmt.Println(t.Minute()) ??? fmt.Println(t.Second()) }
package main ? import ( ??? "fmt" ??? "time" ) func main()? { ??? var t time.Time = time.Now() ??? fmt.Printf("当前的时间是: %d-%d-%d %d:%d:%dn",t.Year(), ??????? t.Month(),t.Day(),t.Hour(),t.Minute(),t.Second()) ? ??? var dateStr = fmt.Sprintf("%d-%d-%d %d:%d:%d",t.Second()) fmt.Println("当前的时间是:",dateStr) } package main ? import ( ??? "fmt" ??? "time" ) func main()? { ??? var t time.Time = time.Now() ??? // 2006/01/02 15:04:05这个字符串是Go语言规定的,各个数字都是固定的 ??? // 字符串中的各个数字可以只有组合,这样就能按照需求返回格式化好的时间 ??? str1 := t.Format("2006/01/02 15:04:05") ??? fmt.Println(str1) ??? str2 := t.Format("2006/01/02") ??? fmt.Println(str2) ??? str3 := t.Format("15:04:05") ??? fmt.Println(str3) }
const ( ??? Nanosecond? Duration = 1 ???// 纳秒 ??? Microsecond????????? = 1000 * Nanosecond // 微秒 ??? Millisecond????????? = 1000 * Microsecond // 毫秒 ??? Second?????????????? = 1000 * Millisecond // 秒 ??? Minute?????????????? = 60 * Second // 分钟 ??? Hour???????????????? = 60 * Minute // 小时 ) package main ? import ( ??? "fmt" ??? "time" ) func main()? { ??? for{ ??????? // 1秒钟打印一次 ??????? time.Sleep(time.Second * 1) ??????? // 0.1秒打印一次 ??????? //time.Sleep(time.Second * 0.1) ??????? time.Sleep(time.Millisecond * 100) ??????? fmt.Println("Hello LNJ") ??? } }
package main ? import ( ??? "fmt" ??? "time" ) ? func main()? { ??? t := time.Now() ??? // 获取1970年1月1日距离当前的时间(秒) ??? fmt.Println(t.Unix()) ??? // 获取1970年1月1日距离当前的时间(纳秒) ??? fmt.Println(t.UnixNano()) } package main ? import ( ??? "fmt" ??? "math/rand" ??? "time" ) func main()? { ??? // 创建随机数种子 ??? rand.Seed(time.Now().UnixNano()) ??? // 生成一个随机数 ??? fmt.Println(rand.Intn(10)) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |