golang正则表达式(golang正则表达式截取字符串)

本篇文章给大家谈谈golang正则表达式,以及golang正则表达式截取字符串对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

golang 正则 regexp包使用

先介绍几种常用的方芦亩法:

1、使用MatchString函数或Match函数

regexp.MatchString(pattern string, s string) pattern为正则表达式,s为需要校验的字陪斗森符串

regexp.Match(pattern string, b []byte) pattern为正则表达式,s为需要校验的字符串

它们的作用都是匹配,区别在于参数为字符串和切片

实例如下:

2、使用 Compile函数或MustCompile函数

它们的区别是Compile返回两个参数 Regexp,error类型,而MustCompile只返回 Regexp类型

它们的作用是将正则表达式进行编译,返回优化的 Regexp 结构体,该结构体有需多方法。

实例如下:

3、查找正则匹配字串( 注:函数名包含string的所传参数为string 其他的均为[]byte 带All是所有)

查找正则匹配的字符串位置( 注:函数名包含string的所传参数为销庆string 其他的均为[]byte 带All是所有)

4、替换

正则替换

按原文替换

函数处理替换源字串

5、Regexp结构体中一些常用的方法

[img]

golang规则表达式之贪心(Greedy)和懒惰(Lazy)匹配法

在开始说明贪心(Greedy)和懒惰(Lazy)之前,先解释规则表达式的量词符号(Quantifier Symbols),主要就下表6这个:

简单的说:

举一个例子看稿坦两者的差异:

第一种是贪心法,找到"ab"之后一直往后匹配,直到最后一个"c",所以其输出结果就是"abcabc"。

第二种是懒惰法,找到"ab"之后一直往后匹配,碰到第一个"c"就停止,所以这个例子里面,能找到两个匹配的顷信子串"abc"和"abc"。

其实第二种的懒惰法可以用另外一种写法:

就是在"ab"之后对"非-c"的字符实现贪心法匹配,然后再碰到"c"就停止,这样达到同样的结果。

参考资料:

Greedy and lazy quantifiers

这篇文件比较详细的介绍了贪心法和懒惰法的匹配规则。

不过从具体应用来看,一种需求往往会有多个表达式的写法,所以对于懒惰法的写法也可雀敬轮以用其他的规则表达式来代替,所以如果你实在搞不清楚懒惰法的用处,也可以不用,只要自己找到新的表达法就行。

golang正则表达式 分组命名

正则中有分组这个功能,在golang中也可以使用命名分组。

一次匹配的情况

场景还原如下:

有一行文本,格式为:姓名 年龄 邮箱地址

请将其转换为一个map

代码实现如下:

str := `Alice 20 alice@gmail.com`

// 使用命名分组,显得更清晰

re := regexp.MustCompile(`(?P散脊name[a-zA-Z]+)\s+(?Page\d+)\s+(?Pemail\w+@\w+(?:\.\w+)+)`)

match := re.FindStringSubmatch(str)

groupNames := re.SubexpNames()

fmt.Printf("%v, %v, %d, %d\n", match, groupNames, len(match), len(groupNames))

result := make(map[string]string)

// 转换为map

for i, name := range groupNames {

if i != 0 name != "" { // 第一个分组为空(也就是整个匹配)

result[name] = match[i]

}

}

prettyResult, _ := json.MarshalIndent(result, "", " ")

fmt.Printf("告掘空%s\n", prettyResult)

输出为:

[Alice 20 alice@gmail.com Alice 20 alice@gmail.com], [ name age email], 4, 4

{

"age": "20",

"email": "alice@gmail.com",

"name": "Alice"

}

注意 [ name age email]有4个元素, 第一个为""。

多次匹配的情况

接上面的例子,实现一个更贴近现实的需求:

有一个文件, 内容大致如下:

Alice 20 alice@gmail.com

Bob 25 bob@outlook.com

gerrylon 26 gerrylon@github.com

...

更多内容

和上面一样, 不过这次转出来是一个slice of map, 也就是多个map。

代码如下:

// 文件内容直接用字符串表示

usersStr := `

Alice 20 alice@gmail.com

Bob 25 bob@outlook.com

gerrylon 26 gerrylon@github.com

`

userRe := regexp.MustCompile(`(?Pname[a-zA-Z]+)\s+(?Page\d+)\s+(?Pemail\w+@\w+(?:\.\w+)+)`)

// 这里要用FindAllStringSubmatch,找到所有的匹配

users := userRe.FindAllStringSubmatch(usersStr, -1)

groupNames := userRe.SubexpNames()

var result []map[string]string // slice of map

// 循环所有行

for _, user := range users {

m := make(map[string]string)

// 对每一行生成一个map

for j, name := range groupNames {

if j != 0 name != "" {

m[name] = strings.TrimSpace(user[j])

}

}

result = append(result, m)

}

prettyResult, _ := json.MarshalIndent(result, "", " ")

fmt.Println(string(prettyResult))

输出为:

[

{

"age": "20",

"email": "alice@gmail.com",

"袜瞎name": "Alice"

},

{

"age": "25",

"email": "bob@outlook.com",

"name": "Bob"

},

{

"age": "26",

"email": "gerrylon@github.com",

"name": "gerrylon"

}

]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

总结

使用命名分组可以使正则表示的意义更清晰。

转换为map更加符合人类的阅读习惯,不过比一般的根据索引取分组值麻烦一些。

————————————————

版权声明:本文为CSDN博主「butterfly5211314」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:

golang 正则正则表达式反向查询

基本上所有的语言都有正则表达式,golang也不启坦例外。golang原生使用regexp包进行正则表达式的匹配。正常情况下满足基础的查询功能。但是,golang为了正则表达式的效率一直坚持O(n)的搜索复杂度,所以有些搭旁颤高级特性将无法满足。

正则表达式可以通过\1的形式反向查询之前匹配的数据,但是原生自带的regxp是不支持该特性。所知败以只能使用第三方库来支持。

关于golang正则表达式和golang正则表达式截取字符串的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表