go语言正则表达式
我们前两节课爬取珍爱网的时候,用到了很多正则表达式去匹配城市列表、城市、用户信息,其实除了正则表达式去匹配,还可以利用goquery和xpath第三方库匹配有用信息。而我利用了更优雅的正则表达式匹配。下来大概介绍下正则表达式。
比如我们匹配城市列表的时候,会取匹配所有城市的url,如下:
可以看到图片后是小写字母加数字,那么就可以用以下方式提取:
<a href="(http://www.zhenai.com/zhenghun/[0-9a-z]+)"[^>]*>([^<]+)</a>
[0-9a-z]+表示匹配小写字母或者数字至少一次,[>]*表示匹配非>的字符任意次,然后[<]+表示匹配非<字符至少一次。我们要取到城市的url和城市名,所以对进行了分组。
通过以下方式就可以拿到url和city
const (
cityListReg = `<a href="(http://www.zhenai.com/zhenghun/[0-9a-z]+)"[^>]*>([^<]+)</a>`
)
compile := regexp.MustCompile(cityListReg)
submatch := compile.FindAllSubmatch(contents, -1)
for _, m := range submatch {
fmt.Println("url:" , string(m[1]), "city:", string(m[2]))
}
匹配包含g g,且gg中间至少一个小写字母:
//匹配包含g g,且gg中间至少一个小写字母
match, _ := regexp.MatchString("g([a-z]+)g", "11golang11")
//true
fmt.Println(match)
上面我们直接使用了字符串匹配的正则表达式,但是对于其他的正则匹配任务,需要使用一个优化过的正则对象:
compile, err := regexp.Compile("smallsoup@gmail.com")
if err != nil {
//....正则语法错误,需要处理错误
fmt.Println(err)
}
//smallsoup@gmail.com
fmt.Println(compile.FindString(text))
compile, err :=regexp.Compile("smallsoup@gmail.com")
函数返回一个正则表达式匹配器和错误,当参数正则表达式不符合正则语法时返回error,比如说regexp.Compile("[smallsoup@gmail.com")就会报错missing closing ]
一般正则表达式是用户输入的才需要处理错误,而自己写的一般是不会有错的,所以可以使用compile:= regexp.MustCompile("smallsoup@gmail.com"),如果语法错误,就会发生panic。
text1 := `my email is aa@qq.com
aa email is aa@gmail.com
bb email is bb@qq.com
cc email is cc@qq.com.cn
`
//如果要提取A@B.C中的A、B、C,需要用到正则表达式的提取功能。
comp := regexp.MustCompile(`([a-zA-Z0-9]+)@([a-zA-Z0-9.]+)\.([a-zA-Z0-9]+)`)
//利用自匹配获取正则表达式里括号中的匹配内容
submatchs := comp.FindAllStringSubmatch(text1, -1)
//submatchs其实是一个二维数组
fmt.Println(submatchs)
//去除每个匹配,submatch其实还是个slice
for _, submatch := range submatchs {
fmt.Println(submatch)
}
结果输出如下:
[[aa@qq.com aa qq com] [aa@gmail.com aa gmail com] [bb@qq.com bb qq com] [cc@qq.com.cn cc qq.com cn]]
[aa@qq.com aa qq com]
[aa@gmail.com aa gmail com]
[bb@qq.com bb qq com]
[cc@qq.com.cn cc qq.com cn]
r := regexp.MustCompile("p([a-z]+)ch")
fmt.Println(r) //----->p([a-z]+)ch
//regexp 包也可以用来替换部分字符串为其他值。
fmt.Println(r.ReplaceAllString("a peach", "<smallsoup>")) //----->a <smallsoup>
//Func 变量允许传递匹配内容到一个给定的函数中,
in := []byte("a smallsoup")
out := r.ReplaceAllFunc(in, bytes.ToUpper)
fmt.Println(string(out)) //----->a PEACH
/*#######################常见表达式###########################*/
// 查找汉字
testText := "Hello 你好吗, I like golang!"
reg := regexp.MustCompile(`[\p{Han}]+`)
fmt.Println(reg.FindAllString(testText, -1)) // ----->[你好]
reg = regexp.MustCompile(`[\P{Han}]+`)
fmt.Println(reg.FindAllString(testText, -1)) // ----->["Hello " ", I li golang!"]
fmt.Printf("%q\n", reg.FindAllString(testText, -1)) // ----->["Hello " ", I lm golang!"]
//Email
reg = regexp.MustCompile(`\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*`)
fmt.Println(reg.MatchString("smallsoup@qq.com"))
//用户名密码:
reg = regexp.MustCompile(`[a-zA-Z]|\w{6,18}`)
fmt.Println(reg.MatchString("w_dy_246"))
运行结果如下:
p([a-z]+)ch
a <smallsoup>
a smallsoup
[你好吗]
[Hello , I like golang!]
["Hello " ", I like golang!"]
true
true
Process finished with exit code 0
本公众号免费提供csdn下载服务,海量IT学习资源,如果你准备入IT坑,励志成为优秀的程序猿,那么这些资源很适合你,包括但不限于java、go、python、springcloud、elk、嵌入式 、大数据、面试资料、前端 等资源。同时我们组建了一个技术交流群,里面有很多大佬,会不定时分享技术文章,如果你想来一起学习提高,可以公众号后台回复【2】,免费邀请加技术交流群互相学习提高,会不定期分享编程IT相关资源。
扫码关注,精彩内容第一时间推给你
go语言正则表达式的更多相关文章
- 笔记整理——Linux下C语言正则表达式
Linux下C语言正则表达式使用详解 - Google Chrome (2013/5/2 16:40:37) Linux下C语言正则表达式使用详解 2012年6月6日Neal627 views发表评论 ...
- C语言正则表达式详解 regcomp() regexec() regfree()详解
标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库 ...
- c语言正则表达式
标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库 ...
- R语言-正则表达式1
R语言的正则表达式主要用来处理文本资料,比如进行查找.替换等等. 首先是一些处理文本时会用到的函数: 字符串分割:strsplit() 字符串连接:paste(),paste0() 计算字符串长度:n ...
- c语言 正则表达式 IP地址
#include <stdio.h> #include <string.h> #include <regex.h> #define SUBSLEN 10 /* 匹配 ...
- JS 正则表达式中的特殊字符
正则表达式中的特殊字符 字符 含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个 ...
- JS正则表达式大全(整理详细且实用)
JS正则表达式大全(整理详细且实用).需要的朋友可以过来参考下,希望对大家有所帮助!! 正则表达式中的特殊字符 字符 含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释, ...
- js常用正则表达式2
字符 含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界. -或- 对 ...
- js里正则表达式详解
详细内容请点击 正则表达式中的特殊字符 字符 含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/ ...
随机推荐
- Apache JMeter (二)性能测试 入门实例
上一节我们说了关于Jmeter环境的配置,接下来讲一个测试的实例. 1.运行Jmeter 进入Jmeter程序所在目录,运行"bin/jmeter.bat" Jmeter支持中文, ...
- 字符串和Date互相转化
话不多说,上程序,如图: public class TestDate { public static void main(String[] args) throws ParseException { ...
- go 学习笔记之学习函数式编程前不要忘了函数基础
在编程世界中向来就没有一家独大的编程风格,至少目前还是百家争鸣的春秋战国,除了众所周知的面向对象编程还有日渐流行的函数式编程,当然这也是本系列文章的重点. 越来越多的主流语言在设计的时候几乎无一例外都 ...
- Linux环境下进行分布式压测踩过的坑
背景:公司为了满足大并发的情况,需要测试组配合,就需要分布式压测,这里我把我踩过坑都记录下来: 环境:Linux + jmeter-v.5.1.1;使用3台2核4G的压力机: Q1: Server f ...
- 详细的App推广前的准备工作
App开发完成后,推广App自然就成为下一步工作的重点.兵马未动,粮草先行,这里为大家整理了一份App推广前需要准备一些事项,希望能给正在准备开展App推广的小伙伴们一些帮助. 众所周知,App推广的 ...
- 使用ajax提交的json数据,产生筹码问题
使用ajax提交的json数据,我们必须添加produces注解,如下所示.否则将会产生乱码 方法一:添加produces注解 @ApiOperation(value = "删除日志&quo ...
- Beescms_v4.0 sql注入漏洞分析
Beescms_v4.0 sql注入漏洞分析 一.漏洞描述 Beescms v4.0由于后台登录验证码设计缺陷以及代码防护缺陷导致存在bypass全局防护的SQL注入. 二.漏洞环境搭建 1.官方下载 ...
- PHP5.6版本在Windows上安装redis扩展
PHP使用redis扩展 一.php安装redis扩展 1.使用phpinfo()函数查看PHP的版本信息,这会决定扩展文件版本 2.根据PHP版本号,编译器版本号和CPU架构, 选择 ...
- python 数据分析师
简介 越来越多的政府机关.企事业单位将选择拥有数据分析师资质的专业人士为他们的项目做出科学.合理的分析.以便正确决策:越来越多的风险投资机构把数据分析师所出具的数据分析报告作为其判断项目是否可行及是否 ...
- SpringBootSecurity学习(05)网页版登录内存中配置默认用户
默认用户 前面的例子中我们使用的都是配置文件中配置好的默认用户: 除了可以配置账号密码,还可以在配置文件中配置角色: 这个角色是后面实现权限过滤的重要内容,后面会重点讨论. 在内存中配置默认用户 这样 ...