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高级特性
- 范围匹配:
g, _ := genex.New("[1-3]{2}")
fmt.Println(g.GenerateAll()) // [11 12 13 21 22 23 31 32 33]
- 可选元素:
g, _ := genex.New("a?b")
fmt.Println(g.GenerateAll()) // [ab b]
- 重复模式:
g, _ := genex.New("a{1,2}")
fmt.Println(g.GenerateAll()) // [a aa]
- 复杂组合:
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)
}
性能考虑
- 对于简单匹配,标准库
regexp
通常更快 - genex在需要生成所有可能匹配时更有优势
- 复杂表达式可能导致组合爆炸,需谨慎使用
总结
Go的标准库regexp
已经提供了强大的正则表达式功能,适合大多数匹配和替换场景。genex库则扩展了这一能力,特别适合需要生成所有可能匹配字符串的场景,如测试用例生成、模糊测试等。
选择工具时:
- 使用标准库进行常规字符串匹配和提取
- 使用genex当需要枚举所有可能的匹配组合
- 对于非常复杂的模式,考虑结合两者使用