Go语言中对输入做正则表达式验证

        正则表达式在很多语言中都被支持,用的很广泛,尤其是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)
}

你可能感兴趣的:(Golang,正则表达式,golang,regexp,MatchString)