golang正则表达式匹配与扩展工具插件库genex的使用

golang正则表达式匹配与扩展工具插件库genex的使用

简介

Genex是一个Go语言包,用于将给定的正则表达式扩展为所有可能的匹配字符串。这个包简单高效,是namegrep网站的核心技术。

使用示例

package main

import (
    "fmt"
    "regexp/syntax"

    "github.com/alixaxel/genex"
)

func main() {
    // 解析字符集 [0-9a-z]
    charset, _ := syntax.Parse(`[0-9a-z]`, syntax.Perl)

    // 解析正则表达式 (foo|bar|baz){1,2}\d
    if input, err := syntax.Parse(`(foo|bar|baz){1,2}\d`, syntax.Perl); err == nil {
        // 计算可能的组合数量
        fmt.Println("Count:", genex.Count(input, charset, 3))

        // 生成所有可能的匹配字符串
        genex.Generate(input, charset, 3, func(output string) {
            fmt.Println("[*]", output)
        })
    }
}

输出结果

Count: 120

[*] foo0
[*] ...
[*] foo9
[*] foofoo0
[*] ...
[*] foofoo9
[*] foobar0
[*] ...
[*] foobar9
[*] foobaz0
[*] ...
[*] foobaz9
[*] bar0
[*] ...
[*] bar9
[*] barfoo0
[*] ...
[*] barfoo9
[*] barbar0
[*] ...
[*] barbar9
[*] barbaz0
[*] ...
[*] barbaz9
[*] baz0
[*] ...
[*] baz9
[*] bazfoo0
[*] ...
[*] bazfoo9
[*] bazbar0
[*] ...
[*] bazbar9
[*] bazbaz0
[*] ...
[*] bazbaz9

安装方法

go get github.com/alixaxel/genex

许可证

MIT


更多关于golang正则表达式匹配与扩展工具插件库genex的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang正则表达式匹配与扩展工具插件库genex的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang正则表达式匹配与genex扩展工具库

标准库正则表达式

Go语言内置的regexp包提供了强大的正则表达式功能。下面是一些基本用法:

package main

import (
	"fmt"
	"regexp"
)

func main() {
	// 编译正则表达式
	re := regexp.MustCompile(`foo(.?)`)

	// 匹配测试
	fmt.Println(re.MatchString("foobar")) // true

	// 查找匹配
	fmt.Println(re.FindString("foo foo"))) // "foo "

	// 查找所有匹配
	fmt.Println(re.FindAllString("foo foo", -1)) // ["foo ", "foo "]

	// 替换
	fmt.Println(re.ReplaceAllString("foo foo", "bar$1"))) // "bar bar"

	// 分组提取
	re = regexp.MustCompile(`(?P<first>\w+) (?P<last>\w+)`)
	matches := re.FindStringSubmatch("John Doe")
	for i, name := range re.SubexpNames() {
		if i != 0 && name != "" {
			fmt.Printf("%s: %s\n", name, matches[i])
		}
	}
	// 输出:
	// first: John
	// last: Doe
}

genex库介绍

genex (Generalized Expression) 是一个Go语言的扩展正则表达式库,它提供了比标准库更强大的模式匹配功能,特别是支持生成所有可能的匹配字符串。

安装genex

go get github.com/0x656b694d/genex

genex基本用法

package main

import (
	"fmt"
	"github.com/0x656b694d/genex"
)

func main() {
	// 编译genex表达式
	g, err := genex.New("(hello|hi) (world|there)")
	if err != nil {
		panic(err)
	}

	// 生成所有可能的组合
	combinations := g.GenerateAll()
	fmt.Println(combinations)
	// 输出: [hello world hello there hi world hi there]

	// 检查字符串是否匹配模式
	fmt.Println(g.MatchString("hello there")) // true
	fmt.Println(g.MatchString("hi universe")) // false
}

genex高级特性

  1. 范围匹配
g, _ := genex.New("[1-3]{2}")
fmt.Println(g.GenerateAll()) // [11 12 13 21 22 23 31 32 33]
  1. 可选元素
g, _ := genex.New("a?b")
fmt.Println(g.GenerateAll()) // [ab b]
  1. 重复模式
g, _ := genex.New("a{1,2}")
fmt.Println(g.GenerateAll()) // [a aa]
  1. 复杂组合
g, _ := genex.New("(I am|We are) (a|an) (developer|programmer)")
fmt.Println(g.GenerateAll())
// 输出: [I am a developer I am a programmer I am an developer I am an programmer 
//       We are a developer We are a programmer We are an developer We are an programmer]

实际应用示例

测试用例生成

func generateTestEmails() []string {
	g, _ := genex.New("[a-z]{3,5}@(gmail|yahoo|hotmail)\\.com")
	return g.GenerateAll()
}

配置验证

func validateConfig(input string) bool {
	g, _ := genex.New("(debug|info|warn|error):(true|false)")
	return g.MatchString(input)
}

密码策略检查

func checkPasswordPolicy(pwd string) bool {
	// 要求: 8-16字符, 至少1大写, 1小写, 1数字, 1特殊字符
	g, _ := genex.New("^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,16}$")
	return g.MatchString(pwd)
}

性能考虑

  1. 对于简单匹配,标准库regexp通常更快
  2. genex在需要生成所有可能匹配时更有优势
  3. 复杂表达式可能导致组合爆炸,需谨慎使用

总结

Go的标准库regexp已经提供了强大的正则表达式功能,适合大多数匹配和替换场景。genex库则扩展了这一能力,特别适合需要生成所有可能匹配字符串的场景,如测试用例生成、模糊测试等。

选择工具时:

  • 使用标准库进行常规字符串匹配和提取
  • 使用genex当需要枚举所有可能的匹配组合
  • 对于非常复杂的模式,考虑结合两者使用
回到顶部