正则表达在go语言中的简单使用

本文介绍了正则表达式的概念、常用规则及在Go语言中的应用。包括单字符、结合与重复等基本元素,以及如何在Go中使用正则进行匹配、查找、替换等操作。

1.1.正则表达式的含义

含义:正则表达式就是正则字符和普通字符组成字符串的规则

1.2.正则表达式的内容

内容如下:

单字符:
        .              任意字符(标志s==true时还包括换行符)
        [xyz]          字符族
        [^xyz]         反向字符族
        \d             Perl预定义字符族
        \D             反向Perl预定义字符族
        [:alpha:]      ASCII字符族
        [:^alpha:]     反向ASCII字符族
        \pN            Unicode字符族(单字符名),参见unicode包
        \PN            反向Unicode字符族(单字符名)
        \p{Greek}      Unicode字符族(完整字符名)
        \P{Greek}      反向Unicode字符族(完整字符名)
结合:
        xy             匹配x后接着匹配y
        x|y            匹配x或y(优先匹配x)
重复:
        x*             重复>=0次匹配x,越多越好(优先重复匹配x)
        x+             重复>=1次匹配x,越多越好(优先重复匹配x)
        x?             01次匹配x,优先1次
        x{n,m}         n到m次匹配x,越多越好(优先重复匹配x)
        x{n,}          重复>=n次匹配x,越多越好(优先重复匹配x)
        x{n}           重复n次匹配x
        x*?            重复>=0次匹配x,越少越好(优先跳出重复)
        x+?            重复>=1次匹配x,越少越好(优先跳出重复)
        x??            01次匹配x,优先0次
        x{n,m}?        n到m次匹配x,越少越好(优先跳出重复)
        x{n,}?         重复>=n次匹配x,越少越好(优先跳出重复)
        x{n}?          重复n次匹配x
分组:
        (re)           编号的捕获分组
        (?P<name>re)   命名并编号的捕获分组
        (?:re)         不捕获的分组
        (?flags)       设置当前所在分组的标志,不捕获也不匹配
        (?flags:re)    设置re段的标志,不捕获的分组
标志的语法为xyz(设置)、-xyz(清楚)、xy-z(设置xy,清楚z),标志如下:
        I              大小写敏感(默认关闭)
        m              ^和$在匹配文本开始和结尾之外,还可以匹配行首和行尾(默认开启)
        s              让.可以匹配\n(默认关闭)
        U              非贪婪的:交换x*和x*?、x+和x+?……的含义(默认关闭)
边界匹配:
        ^              匹配文本开始,标志m为真时,还匹配行首
        $              匹配文本结尾,标志m为真时,还匹配行尾
        \A             匹配文本开始
        \b             单词边界(一边字符属于\w,另一边为文首、文尾、行首、行尾或属于\W)
        \B             非单词边界
        \z             匹配文本结尾
转义序列:
        \a             响铃符(\007)
        \f             换纸符(\014)
        \t             水平制表符(\011)
        \n             换行符(\012)
        \r             回车符(\015)
        \v             垂直制表符(\013)
        \123           八进制表示的字符码(最多三个数字)
        \x7F           十六进制表示的字符码(必须两个数字)
        \x{10FFFF}     十六进制表示的字符码
        \*             字面值'*'
        \Q...\E        反斜线后面的字符的字面值
字符族(预定义字符族之外,方括号内部)的语法:
        x              单个字符
        A-Z            字符范围(方括号内部才可以用)
        \d             Perl字符族
        [:foo:]        ASCII字符族
        \pF            单字符名的Unicode字符族
        \p{Foo}        完整字符名的Unicode字符族
预定义字符族作为字符族的元素:
        [\d]           == \d
        [^\d]          == \D
        [\D]           == \D
        [^\D]          == \d
        [[:name:]]     == [:name:]
        [^[:name:]]    == [:^name:]
        [\p{Name}]     == \p{Name}
        [^\p{Name}]    == \P{Name}
Perl字符族:
        \d             == [0-9]
        \D             == [^0-9]
        \s             == [\t\n\f\r ]
        \S             == [^\t\n\f\r ]
        \w             == [0-9A-Za-z_]
        \W             == [^0-9A-Za-z_]
ASCII字符族:
        [:alnum:]      == [0-9A-Za-z]
        [:alpha:]      == [A-Za-z]
        [:ascii:]      == [\x00-\x7F]
        [:blank:]      == [\t ]
        [:cntrl:]      == [\x00-\x1F\x7F]
        [:digit:]      == [0-9]
        [:graph:]      == [!-~] == [A-Za-z0-9!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~]
        [:lower:]      == [a-z]
        [:print:]      == [ -~] == [ [:graph:]]
        [:punct:]      == [!-/:-@[-`{-~]
        [:space:]      == [\t\n\v\f\r ]
        [:upper:]      == [A-Z]
        [:word:]       == [0-9A-Za-z_]
        [:xdigit:]     == [0-9A-Fa-f]     

1.3.常用的正则规则


* `/+特殊字母` : 代表某个取值范围
* `[内容]`:代表一个字符,字符的取值范围就是内部的内容
* `{n,m}`个数,大于等于n小于等于m个
* `.`一个任意内容的字符
* `^`开始
* `$`结束
* `+`至少一个
* `*`任意个
* `?`最多一个

1.4.go语言对正则表达式的支持

go语言在regexp包中提供了对正则表达式的支持,并提供了RegExp结构体。

Regex的介绍如下:

regexp包实现了正则表达式搜索。
正则表达式采用RE2语法(除了\c、\C),和Perl、Python等语言的正则基本一致。

Regexp结构体的源码如下:

type Regexp struct {	
	// read-only after Compile
	regexpRO

	// cache of machines for running regexp
	mu      sync.Mutex
	machine []*machine
}

从源码中可以看出:里面有互斥锁,所以在并发下是安全的。

1.5Tegexp的简单使用

首先,判断字符串是否正则匹配时可以用到Tegexp:

判断方法如下:

result,_:=regexp.MatchString(`^\d\w$`,"5A")
	fmt.Println(result)

如果输出result的值为true,则该字符串正则匹配,反之不是。

如果需要更多的功能,也可以使用Regexp的方式实现,下面列举除了一些常用方法

package main

import (
	"regexp"
	"fmt"
)

func main() {
	//创建结构体变量
	r := regexp.MustCompile(`\d[a-zA-Z]`)
	//判断是否匹配
	fmt.Println(r.MatchString("5A1"))
	/*
	字符串中满足要求的片段,返回[]string
	第二个参数是[]string的长度,-1表示不限制长度
	 */
	fmt.Println(r.FindAllString("56A6B7C", -1))
	/*
	把正则表达式匹配的结果当作拆分符,拆分字符串
	n > 0 : 返回最多n个子字符串,最后一个子字符串是剩余未进行分割的部分。
	n == 0: 返回nil (zero substrings)
	n < 0 : 返回所有子字符串
	 */
	fmt.Println(r.Split("12345qwert", -1))
	//把满足正则要求内容替换成指定字符串
	fmt.Println(r.ReplaceAllString("12345qwert", "替换了"))
}

服务器端数据校验

  • 数据校验可以有客户端数据校验和服务器端数据校验.双重保证是保证程序安全性的有效措施
  • 客户端向服务端发送请求参数,服务器端接收到请求参数后使用正则验证,验证结果通过才能正确执行,例如注册时验证数据格式

使用正则表达式的相关内容可以制作一个网页用于判断用户注册信息,进行数据校验。

具体示例如下:

前端代码如下(html):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title></title>
</head>
<body>
<form action="register" method="post">
    用户名:<input type="text" name="username"/>用户名必须时6-12位,只能包含字符或数字<br/>
    <input type="submit" value="注册"/>
</form>
</body>
</html>

服务器端代码如下:

package main

import (
	"fmt"
	"net/http"
	"regexp"
)

func welcome(w http.ResponseWriter, r *http.Request) {
	t, _ := template.ParseFiles("view/index.html")
	t.Execute(w, nil)
}
func register(w http.ResponseWriter, r *http.Request) {
	{
		u := r.FormValue("username")
		r, _ := regexp.MatchString(`^[0-9a-zA-Z]{6,12}$`, u)
		if r {
			fmt.Fprintln(w, "注册成功")
		} else {
			fmt.Fprintln(w, "用户名格式不正确")
		}
	}
}
func main() {
	server := http.Server{Addr: ":8090"}
	http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
	http.HandleFunc("/", welcome)
	http.HandleFunc("/register", register)
	server.ListenAndServe()
}

### 正则表达式在编程语言中的概念 正则表达式(Regular Expression,简称Regex)是一种用于描述字符串模式的工具,广泛应用于编程语言中的字符串匹配、查找、替换等操作。它通过一组特定的规则和语法,允许开发者对文本进行复杂的模式匹配和处理。正则表达式的核心思想是使用元字符和普通字符的组合来定义一个匹配模式,从而实现对字符串的高效操作[^1]。 正则表达式的起源可以追溯到20世纪40年代的数学研究,随后被引入计算机科学领域,并在UNIX系统中得到了广泛应用。如今,正则表达式已成为几乎所有主流编程语言的标准功能之一,包括R语言Go语言、Python、Java等,尽管不同语言的实现方式和语法细节可能略有差异[^2]。 ### 正则表达式的基本组成 正则表达式的基本语法包括**普通字符**(如字母和数字)和**元字符**(具有特殊含义的字符)。元字符可以定义字符的范围、重复次数、位置等,例如: - `.` 匹配任意单个字符 - `\d` 匹配任意数字 - `*` 匹配前一个字符0次或多次 - `^` 和 `$` 分别匹配字符串的开始和结束位置 这些元字符可以组合使用,以构建更复杂的匹配规则。例如,正则表达式 `^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$` 可以用于验证电子邮件地址的格式[^1]。 ### 正则表达式在编程语言中的应用 在编程语言中,正则表达式通常通过内置库或模块实现。例如,在Go语言中,`regexp` 包提供了对正则表达式的支持,使得开发者可以轻松进行模式匹配和字符串替换操作[^3]。以下是一个使用Go语言进行正则表达式匹配的示例: ```go package main import ( "fmt" "regexp" ) func main() { // 定义正则表达式模式 pattern := `^([A-Za-z0-9._%+-]+)@([A-Za-z0-9.-]+)\.([A-Za-z]{2,})$` // 编译正则表达式 re := regexp.MustCompile(pattern) // 测试字符串 testStr := "example@example.com" // 检查是否匹配 if re.MatchString(testStr) { fmt.Println("匹配成功") } else { fmt.Println("匹配失败") } } ``` 上述代码展示了如何使用Go语言中的正则表达式来验证电子邮件地址的格式。类似的功能也可以在其他编程语言中实现,例如Python的`re`模块、Java的`java.util.regex`包等[^3]。 ### 正则表达式的实际用途 正则表达式的主要用途包括: - **文本匹配**:检查字符串是否符合特定的格式,如电话号码、身份证号、URL等。 - **字符串提取**:从一段文本中提取符合某种模式的子字符串。 - **字符串替换**:将符合特定模式的字符串替换为其他内容。 - **字符串分割**:根据某种模式将字符串拆分为多个部分。 例如,在R语言中,正则表达式常用于数据清洗和文本分析任务。`grep()`、`sub()` 和 `strsplit()` 等函数都支持正则表达式,使得开发者可以高效地处理文本数据。 ### 示例:正则表达式在不同编程语言中的对比 不同编程语言正则表达式的支持略有差异。例如,在PHP中,正则表达式可以使用`preg_match()`函数进行匹配,而在C#中可以使用`Regex`类[^4]。以下是Python中使用正则表达式提取字符串中的数字的示例: ```python import re text = "The price is $123.45" # 使用正则表达式提取数字 numbers = re.findall(r'\d+\.\d+|\d+', text) print(numbers) # 输出 ['123.45'] ``` 该示例展示了如何使用Python的`re`模块提取字符串中的数字部分,包括整数和小数。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值