ToB企服应用市场:ToB评测及商务社交产业平台

标题: golang正则表达式的使用及举例 [打印本页]

作者: 半亩花草    时间: 2024-10-28 16:16
标题: golang正则表达式的使用及举例
正则表达式很强大,在一些场合如抓包,爬虫等方面很有效。在 Go语言中,正则表达式通过标准库 regexp 提供支持。使用正则表达式可以进行字符串匹配、替换和分割等操纵。
  以下是正则表达式的根本使用方法及示例:
1. 导入 regexp 包

在你的 Go 代码中,首先必要导入 regexp 包:
  1. import (
  2.     "fmt"
  3.     "regexp"
  4. )
复制代码
2. 编译正则表达式
使用 regexp.Compile 或 regexp.MustCompile 来编译正则表达式。MustCompile 在编译出错时会导致程序崩溃,因此对于已知的正则表达式可直接使用它。
  1. re, err := regexp.Compile("a([a-z]+)e")
  2. if err != nil {
  3.     fmt.Println("Error compiling regex:", err)
  4. }
复制代码
或使用:
  1. re := regexp.MustCompile("a([a-z]+)e")
复制代码
3. 使用正则表达式

编译后的正则表达式可以用于多种功能:
3.1. 匹配字符串

使用 MatchString 函数判断字符串是否符合正则表达式。
  1. matched := re.MatchString("apple")
  2. fmt.Println("Matched:", matched) // 输出: Matched: true
复制代码
3.2. 查找匹配

使用 FindString 获取匹配的子串。
  1. result := re.FindString("I have an apple here.")
  2. fmt.Println("Found:", result) // 输出: Found: apple
复制代码
3.3. 查找全部匹配

使用 FindAllString 获取全部匹配的子串。
  1. results := re.FindAllString("I have an apple and an axe here.", -1)
  2. fmt.Println("Found all:", results) // 输出: Found all: [apple axe]
复制代码
3.4. 替换

使用 ReplaceAllString 替换匹配的子串。
  1. replaced := re.ReplaceAllString("I have an apple and an axe here.", "fruit")
  2. fmt.Println("Replaced:", replaced) // 输出: Replaced: I have an fruit and an fruit here.
复制代码
3.5. 分割字符串

使用 Split 函数按照正则表达式分割字符串。
  1. splitStrings := re.Split("I have an apple and an axe here.", -1)
  2. fmt.Println("Split:", splitStrings) // 输出: Split: [I have an  and an  here.]
复制代码
完整示例

下面是一个完整的示例,演示了上述功能:
  1. package mainimport (
  2.     "fmt"
  3.     "regexp"
  4. )
  5. func main() {    // 编译正则表达式    re := regexp.MustCompile("a([a-z]+)e")
  6.     // 匹配字符串    matched := re.MatchString("apple")    fmt.Println("Matched:", matched) // 输出: Matched: true    // 找到匹配的字符串    result := re.FindString("I have an apple here.")    fmt.Println("Found:", result) // 输出: Found: apple    // 找到全部匹配的字符串    results := re.FindAllString("I have an apple and an axe here.", -1)    fmt.Println("Found all:", results) // 输出: Found all: [apple axe]    // 替换匹配的子串    replaced := re.ReplaceAllString("I have an apple and an axe here.", "fruit")    fmt.Println("Replaced:", replaced) // 输出: Replaced: I have an fruit and an fruit here.    // 按照正则表达式分割字符串    splitStrings := re.Split("I have an apple and an axe here.", -1)    fmt.Println("Split:", splitStrings) // 输出: Split: [I have an  and an  here.]}
复制代码
要让正则表达式也能匹配到 HelloWorld 这样的字符串,你必要构建一个更灵活的正则表达式,允许字符之间有可选的连字符、空白字符或 · 字符,同时也能匹配一连的字符。
示例代码

  1. package main
  2. import (
  3.     "fmt"
  4.     "regexp"
  5.     "strings"
  6. )
  7. func fuzzyMatch(pattern, text string) bool {
  8.     // 将 pattern 拆分为多个部分
  9.     parts := strings.Split(pattern, "")
  10.     // 构建正则表达式模式
  11.     var regexParts []string
  12.     for _, part := range parts {
  13.         regexParts = append(regexParts, regexp.QuoteMeta(part))
  14.     }
  15.     regexPattern := strings.Join(regexParts, `[-\s·]?`)
  16.     // 构建最终的正则表达式
  17.     finalPattern := fmt.Sprintf("^.*%s.*$", regexPattern)
  18.     re := regexp.MustCompile(finalPattern)
  19.     // 进行匹配
  20.     return re.MatchString(text)
  21. }
  22. func main() {
  23.     pattern := "HelloWorld"
  24.     texts := []string{
  25.         "Hello-World",
  26.         "Hello World",
  27.         "Hello·World",
  28.         "HelloWorld",
  29.     }
  30.     for _, text := range texts {
  31.         if fuzzyMatch(pattern, text) {
  32.             fmt.Printf("Matched: %s\n", text)
  33.         } else {
  34.             fmt.Printf("Not matched: %s\n", text)
  35.         }
  36.     }
  37. }
复制代码
表明
通过这种方式,你可以实现对包罗特定子字符串的字符串进行模糊匹配查找,即使它们之间有空格、标点符号或其他字符,同时也匹配不包罗这些字符的字符串。
输出

  1. Matched: Hello-World
  2. Matched: Hello World
  3. Matched: Hello·World
  4. Matched: HelloWorld
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4