golang 正则正则表达式反向查询基本上所有的语言都有正则表达式 , golang也不例外 。golang原生使用regexp包进行正则表达式的匹配 。正常情况下满足基础的查询功能 。但是,golang为了正则表达式的效率一直坚持O(n)的搜索复杂度,所以有些高级特性将无法满足 。
正则表达式可以通过\1的形式反向查询之前匹配的数据,但是原生自带的regxp是不支持该特性 。所以只能使用第三方库来支持 。
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结构体中一些常用的方法
go语言有支持正则表达式后向引用的方法吗go语言有支持正则表达式后向引用go语言正则表达式练习的方法go语言正则表达式练习,方法如下
package main
import (
"fmt"
"os"
"path/filepath"
"regexp"
)
func main() {
// 命令行参数
args := os.Args
// 检查参数
if len(args) == 1 {
fmt.Println("ff is a file find tool. use like bottom")
fmt.Println("ff [dir] [regexp]")
return
}
if len(args)3 {
fmt.Println("args3")
return
}
fileName := args[1]
pattern := args[2]
file, err := os.Open(fileName)
if err != nil {
fmt.Println(err)
return
}
fi, err := file.Stat()
if err != nil {
fmt.Println(err)
return
}
if !fi.IsDir() {
fmt.Println(fileName, " is not a dir")
}
reg, err := regexp.Compile(pattern)
if err != nil {
fmt.Println(err)
return
}
// 遍历目录
filepath.Walk(fileName,
func(path string, f os.FileInfo, err error) error {
if err != nil {
fmt.Println(err)
return err
}
if f.IsDir() {
return nil
}
// 匹配目录
matched := reg.MatchString(f.Name())
if matched {
fmt.Println(path)
}
return nil
})
}
golang规则表达式之贪心(Greedy)和懒惰(Lazy)匹配法在开始说明贪心(Greedy)和懒惰(Lazy)之前 , 先解释规则表达式的量词符号(Quantifier Symbols),主要就下表6这个:
简单的说:
举一个例子看两者的差异:
第一种是贪心法,找到"ab"之后一直往后匹配,直到最后一个"c",所以其输出结果就是"abcabc" 。
第二种是懒惰法,找到"ab"之后一直往后匹配,碰到第一个"c"就停止,所以这个例子里面,能找到两个匹配的子串"abc"和"abc" 。
其实第二种的懒惰法可以用另外一种写法:
就是在"ab"之后对"非-c"的字符实现贪心法匹配,然后再碰到"c"就停止,这样达到同样的结果 。
参考资料:
Greedy and lazy quantifiers
这篇文件比较详细的介绍了贪心法和懒惰法的匹配规则 。
推荐阅读
- 超污恋爱养成游戏破解,超污恋爱养成游戏破解版最新
- python作自相关函数图像,自相关函数代码
- 计算机毕业设计的项目模板,计算机毕设课题大全
- 暴雪嘉年华直播设备,暴雪嘉年华怎么看
- 树的测试代码java java树结构查询
- 新媒体如何命名,新媒体网名怎么起
- 如何用js在指定区域内随机点击,如何用js在指定区域内随机点击
- 视频号直播骗局不发货,在视频号直播间拍产品会显示购买吗
- linux命令英文对照表 linux英文读法