Go语言之正则表达式

1、正则表达式简介:

正则表达式描述了可用于与数据交互的搜索模式,使用正则表达式可完成验证数据、查找数据以及操作大量文本等任务

正则表达式的用途之一是在字符串中查找与指定正则表达式匹配的子串,但是在查找的时候,正则表达式检查是区分大小写的

在Go 语言中,正则表达式功能是由regex 包提供的,这个包实现了正则表达式的查找和模式匹配功能。它使用的是RE2 语法,操作的目标可以是字符串,也可以是字节

使用函数MatchString可以用来匹配字符串,它接受一个正则表达式模式和一个字符串,并根据是否匹配返回true 或false

下面例子表示在字符串b中查找变量为a的字符串内容,如图:

从结果中可以看出,并没有找到符合的字符串,因为正则匹配是区分大小写的,要查找的为小写的hello,在变量b中没有匹配的字段

要以不区分大小写的方式查找,必须修改正则表达式,使其在查找单词时不区分大小写,可修改如下:

运行结果为true,表示可以正常匹配到字符串,如图:

  • 第10行:字符串开头的特殊语法 (?i) 让正则表达式引擎不区分大小写

2、常用的正则表达式语法:

字符含义
.与除换行符之前的其他任何字符都匹配
*与苓个或多个指定的字符匹配
^表示行首,匹配开始
$表示行尾,匹配结尾
+匹配一次或多次
?匹配零或一次
[]与方扩号内指定的任何字符都匹配
{n}匹配n 次
{n,}匹配n 次或更多次
{m,n}最少匹配m 次,最多匹配n 次
[^….]匹配不在[]中的内容,如[^abc]表示匹配除了abc之外的字符
[:alnum:]匹配任意一个字母或者数字,等价于a-zA-Z0-9,使用时也需要中括号[[:alnum:]]
[:^alnum:] 匹配除了字母和数字之外的字符,等价于^a-zA-Z0-9
[:alpha:]匹配任意字母,等价于a-zA-Z
[:digit:]匹配任意一个数字,等价于0-9
[:lower:]匹配任意一个小写字母,等价于a-z
[:upper:]匹配任意一个大写字母,等价于A-Z
[:space:]匹配任意一个空白字符,包括空格、制表符、换行符、分页符等
[:blank:]匹配空格和制表符
[:graph:] 匹配图形字符
[:print:]匹配可打印字符
\w匹配字母或数字或下划线或汉字
\s匹配任意的空白符
\d匹配数字
\b匹配单词的开始或结束
\W匹配任意不是字母,数字,下划线,汉字的字符
\S匹配任意不是空白符的字符
\D匹配任意非数字的字符
\B匹配不是单词开头或结束的位置

例如:^[a-zA-Z0-9]{5-10}$ 表示从字符串开头开始匹配,可以匹配a-z或者A-Z或者0-9中的任意字符,至少匹配5次,最多不超过10次

3、使用正则表达式验证数据:

正则表达式可用于验证程序的输入数据,这是一种分析和理解数据的高效方式,要将正则表达式赋给变量,必须先对其进行分析。用于分析正则表达式的函数有两个:

  • Compile :在正则表达式未能通过编译时返回错误
  • MustCompile :在正则表达式无法编译时引发panic

使用哪一个取决于具体情况,但MustCompile 通常是更佳的选择,如 re := regexp.MustCompile(” ^[a-zA-Z0-9]{5-10} “)

下面例子演示了如何检查用户名,不能以特殊字符开头,如图:

4、使用正则表达式来变换数据:

正则表达式也可用于完成这种任务一一匹配模式并进行替换

下面例子中,对超过12个字符的用户名进行截断为只包含12个字符,并对字符进行判断,如果含有非法字符,将其替换为合法字符,如图:

运行结果如下:

  • 第9行:声明数组,包含4个元素
  • 第15-16行:MustCompile用来解析一个正则表达式是否合法,如果不合法抛出异常,合法则返回Regexp 对象
  • 第18-20行:遍历数组,判断数组元素长度如果大于12,那么进行截取,只保留12个
  • 第22-25行:如果遍历的数组元素不符合第15行定义的正则规则,通过将除了数字和字母外的其余字符替换为Y

标签