正则表达式在很多语言中都被支持,用的很广泛,尤其是WEB开发中都会用到对输入做严格的验证,比如手机号码、年龄、邮箱等这些格式的判断,防止输入一些错误或非法的数据进来。
我们先来看个简单的判断,是否是整数的输入:
package main
import (
"fmt"
"regexp"
"strconv"
)
func main() {
//判断是否是整型
getint, err := strconv.Atoi("12")
fmt.Printf("%v,%v\n", getint, err == nil) //12,true
//正则表达式
m, _ := regexp.MatchString("^[0-9]+$", "12a")
fmt.Printf("%v\n", m) //false
}
如果单纯只是判断类型的话,还可以使用到前面有介绍的反射,甚至还可以用到空接口来判断输入的类型。
fmt.Printf("%v,%v\n", reflect.TypeOf("a").Name() == "int", reflect.TypeOf(12).Name() == "int") //false,true
或者使用空接口:
var i interface{}
i = 12
k, v := i.(int)
fmt.Printf("%v,%v\n", k, v) //12,true
当然更多的时候,我们都会对输入做各种更具体严格的格式验证,这个时候单纯判断类别就行不通了,需要用到正则表达式。
比如上面匹配整数的"^[0-9]+$"正则表达式,^表示开始,$表示结束,中间的[0-9]就是只能是阿拉伯数字,+表示一个或多个的通配符,*就是匹配0个或多个的通配符。
掌握了正则表达式的基本结构之后,对于大部分的正则表达式的验证就显得很简单了,其实也不需要去死记,做个备注,有需要的时候拷贝来使用即可。下面是一些常用的正则表达式:
package main
import (
"fmt"
"reflect"
"regexp"
"strconv"
)
func main() {
//判断是否是整型
getint, err := strconv.Atoi("12")
fmt.Printf("%v,%v\n", getint, err == nil) //12,true
//正则表达式
m, _ := regexp.MatchString("^[0-9]+$", "12a")
fmt.Printf("%v\n", m) //false
fmt.Printf("%v,%v\n", reflect.TypeOf("a").Name() == "int", reflect.TypeOf(12).Name() == "int") //false,true
var i interface{}
i = 12
k, v := i.(int)
fmt.Printf("%v,%v\n", k, v) //12,true
//中文
m2, _ := regexp.MatchString("^\\p{Han}+$", "寅恪光潜")
fmt.Printf("%v\n", m2) //true
//中英文的标点符号
m3, _ := regexp.MatchString("^\\p{P}+$", ".。,")
fmt.Printf("%v\n", m3) //true
//全部大写英文
m4, _ := regexp.MatchString("^[A-Z]+$", "ABC")
fmt.Printf("%v\n", m4) //true
//全部小写英文
m5, _ := regexp.MatchString("^[a-z]+$", "abc")
fmt.Printf("%v\n", m5) //true
//大小写英文
m6, _ := regexp.MatchString("^[a-zA-Z]+$", "abABCrw")
fmt.Printf("%v\n", m6)
//邮件地址
m7, _ := regexp.MatchString(`^([\w\.\_]{2,10})@(\w{1,})\.([a-z]{2,4})$`, "[email protected]")
fmt.Printf("%v\n", m7)
//手机号码
m8, _ := regexp.MatchString(`^(1[3|4|5|8][0-9]\d{4,8})$`, "13312345678")
fmt.Printf("%v\n", m8)
//身份证(15位全数字,或18位的,最后一位是数字或X)
m9, _ := regexp.MatchString(`^(\d{15})$`, "123456789123456")
m10, _ := regexp.MatchString(`^(\d{17})([0-9]|([xX]))$`, "12345678912345678x")
fmt.Printf("%v,%v\n", m9, m10)
}