热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Go的Regexp

https:my.oschina.netkuerantblog199146Golang学习-regexp包------------------------------------

https://my.oschina.net/kuerant/blog/199146 

Golang学习 - regexp 包------------------------------------------------------------// 函数// 判断在 b(s、r)中能否找到 pattern 所匹配的字符串
func Match(pattern string, b []byte) (matched bool, err error)
func MatchString(pattern string, s string) (matched bool, err error)
func MatchReader(pattern string, r io.RuneReader) (matched bool, err error)// 将 s 中的正则表达式元字符转义成普通字符。
func QuoteMeta(s string) string------------------------------// 示例:MatchString、QuoteMeta
func main() {pat := `(((abc.)def.)ghi)`src := `abc-def-ghi abc+def+ghi`fmt.Println(regexp.MatchString(pat, src))// true fmt.Println(regexp.QuoteMeta(pat))// \(\(\(abc\.\)def\.\)ghi\)
}------------------------------------------------------------// Regexp 代表一个编译好的正则表达式,我们这里称之为正则对象。正则对象可以
// 在文本中查找匹配的内容。
//
// Regexp 可以安全的在多个例程中并行使用。
type Regexp struct { ... }------------------------------// 编译// 将正则表达式编译成一个正则对象(使用 PERL 语法)。
// 该正则对象会采用“leftmost-first”模式。选择第一个匹配结果。
// 如果正则表达式语法错误,则返回错误信息。
func Compile(expr string) (*Regexp, error)// 将正则表达式编译成一个正则对象(正则语法限制在 POSIX ERE 范围内)。
// 该正则对象会采用“leftmost-longest”模式。选择最长的匹配结果。
// POSIX 语法不支持 Perl 的语法格式:\d、\D、\s、\S、\w、\W
// 如果正则表达式语法错误,则返回错误信息。
func CompilePOSIX(expr string) (*Regexp, error)// 功能同上,但会在解析失败时 panic
func MustCompile(str string) *Regexp
func MustCompilePOSIX(str string) *Regexp// 让正则表达式在之后的搜索中都采用“leftmost-longest”模式。
func (re *Regexp) Longest()// 返回编译时使用的正则表达式字符串
func (re *Regexp) String() string// 返回正则表达式中分组的数量
func (re *Regexp) NumSubexp() int// 返回正则表达式中分组的名字
// 第 0 个元素表示整个正则表达式的名字,永远是空字符串。
func (re *Regexp) SubexpNames() []string// 返回正则表达式必须匹配到的字面前缀(不包含可变部分)。
// 如果整个正则表达式都是字面值,则 complete 返回 true。
func (re *Regexp) LiteralPrefix() (prefix string, complete bool)------------------------------// 示例:第一匹配和最长匹配
func main() {b := []byte("abc1def1")pat := `abc1|abc1def1`reg1 := regexp.MustCompile(pat) // 第一匹配reg2 := regexp.MustCompilePOSIX(pat) // 最长匹配fmt.Printf("%s\n", reg1.Find(b)) // abc1fmt.Printf("%s\n", reg2.Find(b)) // abc1def1b = []byte("abc1def1")pat = `(abc|abc1def)*1`reg1 = regexp.MustCompile(pat) // 第一匹配reg2 = regexp.MustCompilePOSIX(pat) // 最长匹配fmt.Printf("%s\n", reg1.Find(b)) // abc1fmt.Printf("%s\n", reg2.Find(b)) // abc1def1
}------------------------------// 示例:正则信息
func main() {pat :&#61; &#96;(abc)(def)(ghi)&#96;reg :&#61; regexp.MustCompile(pat)// 获取正则表达式字符串fmt.Println(reg.String()) // (abc)(def)(ghi)// 获取分组数量fmt.Println(reg.NumSubexp()) // 3fmt.Println()// 获取分组名称pat &#61; &#96;(?Pabc)(def)(?Pghi)&#96;reg &#61; regexp.MustCompile(pat)for i :&#61; 0; i <&#61; reg.NumSubexp(); i&#43;&#43; {fmt.Printf("%d: %q\n", i, reg.SubexpNames()[i])}// 0: ""// 1: "Name1"// 2: ""// 3: "Name3"fmt.Println()// 获取字面前缀pat &#61; &#96;(abc1)(abc2)(abc3)&#96;reg &#61; regexp.MustCompile(pat)fmt.Println(reg.LiteralPrefix()) // abc1abc2abc3 truepat &#61; &#96;(abc1)|(abc2)|(abc3)&#96;reg &#61; regexp.MustCompile(pat)fmt.Println(reg.LiteralPrefix()) // falsepat &#61; &#96;abc1|abc2|abc3&#96;reg &#61; regexp.MustCompile(pat)fmt.Println(reg.LiteralPrefix()) // abc false
}------------------------------// 判断// 判断在 b&#xff08;s、r&#xff09;中能否找到匹配的字符串
func (re *Regexp) Match(b []byte) bool
func (re *Regexp) MatchString(s string) bool
func (re *Regexp) MatchReader(r io.RuneReader) bool------------------------------// 查找// 返回第一个匹配到的结果&#xff08;结果以 b 的切片形式返回&#xff09;。
func (re *Regexp) Find(b []byte) []byte// 返回第一个匹配到的结果及其分组内容&#xff08;结果以 b 的切片形式返回&#xff09;。
// 返回值中的第 0 个元素是整个正则表达式的匹配结果&#xff0c;后续元素是各个分组的
// 匹配内容&#xff0c;分组顺序按照“(”的出现次序而定。
func (re *Regexp) FindSubmatch(b []byte) [][]byte// 功能同 Find&#xff0c;只不过返回的是匹配结果的首尾下标&#xff0c;通过这些下标可以生成切片。
// loc[0] 是结果切片的起始下标&#xff0c;loc[1] 是结果切片的结束下标。
func (re *Regexp) FindIndex(b []byte) (loc []int)// 功能同 FindSubmatch&#xff0c;只不过返回的是匹配结果的首尾下标&#xff0c;通过这些下标可以生成切片。
// loc[0] 是结果切片的起始下标&#xff0c;loc[1] 是结果切片的结束下标。
// loc[2] 是分组1切片的起始下标&#xff0c;loc[3] 是分组1切片的结束下标。
// loc[4] 是分组2切片的起始下标&#xff0c;loc[5] 是分组2切片的结束下标。
// 以此类推
func (re *Regexp) FindSubmatchIndex(b []byte) (loc []int)------------------------------// 示例&#xff1a;Find、FindSubmatch
func main() {pat :&#61; &#96;(((abc.)def.)ghi)&#96;reg :&#61; regexp.MustCompile(pat)src :&#61; []byte(&#96;abc-def-ghi abc&#43;def&#43;ghi&#96;)// 查找第一个匹配结果fmt.Printf("%s\n", reg.Find(src)) // abc-def-ghifmt.Println()// 查找第一个匹配结果及其分组字符串first :&#61; reg.FindSubmatch(src)for i :&#61; 0; i }------------------------------// 示例&#xff1a;FindIndex、FindSubmatchIndex
func main() {pat :&#61; &#96;(((abc.)def.)ghi)&#96;reg :&#61; regexp.MustCompile(pat)src :&#61; []byte(&#96;abc-def-ghi abc&#43;def&#43;ghi&#96;)// 查找第一个匹配结果matched :&#61; reg.FindIndex(src)fmt.Printf("%v\n", matched) // [0 11]m :&#61; matched[0]n :&#61; matched[1]fmt.Printf("%s\n\n", src[m:n]) // abc-def-ghi// 查找第一个匹配结果及其分组字符串matched &#61; reg.FindSubmatchIndex(src)fmt.Printf("%v\n", matched) // [0 11 0 11 0 8 0 4]for i :&#61; 0; i }------------------------------// 功能同上&#xff0c;只不过返回多个匹配的结果&#xff0c;而不只是第一个。
// n 是查找次数&#xff0c;负数表示不限次数。
func (re *Regexp) FindAll(b []byte, n int) [][]byte
func (re *Regexp) FindAllSubmatch(b []byte, n int) [][][]bytefunc (re *Regexp) FindAllIndex(b []byte, n int) [][]int
func (re *Regexp) FindAllSubmatchIndex(b []byte, n int) [][]int------------------------------// 示例&#xff1a;FindAll、FindAllSubmatch
func main() {pat :&#61; &#96;(((abc.)def.)ghi)&#96;reg :&#61; regexp.MustCompile(pat)s :&#61; []byte(&#96;abc-def-ghi abc&#43;def&#43;ghi&#96;)// 查找所有匹配结果for _, one :&#61; range reg.FindAll(s, -1) {fmt.Printf("%s\n", one)}// abc-def-ghi// abc&#43;def&#43;ghi// 查找所有匹配结果及其分组字符串all :&#61; reg.FindAllSubmatch(s, -1)for i :&#61; 0; i }------------------------------// 功能同上&#xff0c;只不过在字符串中查找
func (re *Regexp) FindString(s string) string
func (re *Regexp) FindStringSubmatch(s string) []stringfunc (re *Regexp) FindStringIndex(s string) (loc []int)
func (re *Regexp) FindStringSubmatchIndex(s string) []intfunc (re *Regexp) FindAllString(s string, n int) []string
func (re *Regexp) FindAllStringSubmatch(s string, n int) [][]stringfunc (re *Regexp) FindAllStringIndex(s string, n int) [][]int
func (re *Regexp) FindAllStringSubmatchIndex(s string, n int) [][]int// 功能同上&#xff0c;只不过在 io.RuneReader 中查找。
func (re *Regexp) FindReaderIndex(r io.RuneReader) (loc []int)
func (re *Regexp) FindReaderSubmatchIndex(r io.RuneReader) []int------------------------------// 替换&#xff08;不会修改参数&#xff0c;结果是参数的副本&#xff09;// 将 src 中匹配的内容替换为 repl&#xff08;repl 中可以使用 $1 $name 等分组引用符&#xff09;。
func (re *Regexp) ReplaceAll(src, repl []byte) []byte// 将 src 中匹配的内容经过 repl 函数处理后替换回去。
func (re *Regexp) ReplaceAllFunc(src []byte, repl func([]byte) []byte) []byte// 将 src 中匹配的内容替换为 repl&#xff08;repl 为字面值&#xff0c;不解析其中的 $1 $name 等&#xff09;。
func (re *Regexp) ReplaceAllLiteral(src, repl []byte) []byte// 功能同上&#xff0c;只不过在字符串中查找。
func (re *Regexp) ReplaceAllString(src, repl string) string
func (re *Regexp) ReplaceAllStringFunc(src string, repl func(string) string) string
func (re *Regexp) ReplaceAllLiteralString(src, repl string) string// Expand 要配合 FindSubmatchIndex 一起使用。FindSubmatchIndex 在 src 中进行
// 查找&#xff0c;将结果存入 match 中。这样就可以通过 src 和 match 得到匹配的字符串。
// template 是替换内容&#xff0c;可以使用分组引用符 $1、$2、$name 等。Expane 将其中的分
// 组引用符替换为前面匹配到的字符串。然后追加到 dst 的尾部&#xff08;dst 可以为空&#xff09;。
// 说白了 Expand 就是一次替换过程&#xff0c;只不过需要 FindSubmatchIndex 的配合。
func (re *Regexp) Expand(dst []byte, template []byte, src []byte, match []int) []byte// 功能同上&#xff0c;参数为字符串。
func (re *Regexp) ExpandString(dst []byte, template string, src string, match []int) []byte------------------------------// 示例&#xff1a;Expand
func main() {pat :&#61; &#96;(((abc.)def.)ghi)&#96;reg :&#61; regexp.MustCompile(pat)src :&#61; []byte(&#96;abc-def-ghi abc&#43;def&#43;ghi&#96;)template :&#61; []byte(&#96;$0 $1 $2 $3&#96;)// 替换第一次匹配结果match :&#61; reg.FindSubmatchIndex(src)fmt.Printf("%v\n", match) // [0 11 0 11 0 8 0 4]dst :&#61; reg.Expand(nil, template, src, match)fmt.Printf("%s\n\n", dst)// abc-def-ghi abc-def-ghi abc-def- abc-// 替换所有匹配结果for _, match :&#61; range reg.FindAllSubmatchIndex(src, -1) {fmt.Printf("%v\n", match)dst :&#61; reg.Expand(nil, template, src, match)fmt.Printf("%s\n", dst)}// [0 11 0 11 0 8 0 4]// abc-def-ghi abc-def-ghi abc-def- abc-// [12 23 12 23 12 20 12 16]// abc&#43;def&#43;ghi abc&#43;def&#43;ghi abc&#43;def&#43; abc&#43;
}------------------------------// 其它// 以 s 中的匹配结果作为分割符将 s 分割成字符串列表。
// n 是分割次数&#xff0c;负数表示不限次数。
func (re *Regexp) Split(s string, n int) []string// 将当前正则对象复制一份。在多例程中使用同一正则对象时&#xff0c;给每个例程分配一个
// 正则对象的副本&#xff0c;可以避免多例程对单个正则对象的争夺锁定。
func (re *Regexp) Copy() *Regexp------------------------------------------------------------

 


推荐阅读
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 本文介绍了使用C++Builder实现获取USB优盘序列号的方法,包括相关的代码和说明。通过该方法,可以获取指定盘符的USB优盘序列号,并将其存放在缓冲中。该方法可以在Windows系统中有效地获取USB优盘序列号,并且适用于C++Builder开发环境。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
author-avatar
手机用户2602925621
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有