43 lines
1.5 KiB
Go
43 lines
1.5 KiB
Go
package main
|
||
|
||
import (
|
||
"fmt"
|
||
"regexp"
|
||
)
|
||
|
||
func main() {
|
||
// 场景1:Longest 长短匹配对比(最核心模式切换)
|
||
fmt.Println("===== 1. Longest最长匹配 vs 默认first匹配 =====")
|
||
expr := `(a+)|(aaa)`
|
||
// 默认 leftmost-first
|
||
reDefault := regexp.MustCompile(expr)
|
||
fmt.Println("默认模式匹配aaaa:", reDefault.FindString("aaaa")) // 优先第一个分支a+,短匹配
|
||
|
||
// 开启最长匹配
|
||
reLong := regexp.MustCompile(expr)
|
||
reLong.Longest()
|
||
fmt.Println("Longest最长模式匹配aaaa:", reLong.FindString("aaaa"))
|
||
|
||
// 场景2:. 匹配换行 RE2专属 (?s:.)
|
||
fmt.Println("\n===== 2. 点号匹配换行符 =====")
|
||
strWithLine := "hello\nworld"
|
||
// 普通. 不跨换行
|
||
reDotNormal := regexp.MustCompile(`hello.world`)
|
||
fmt.Println("普通.匹配换行:", reDotNormal.MatchString(strWithLine))
|
||
// (?s:.) 让.识别换行
|
||
reDotAll := regexp.MustCompile(`(?s:hello.world)`)
|
||
fmt.Println("(?s:.)开启跨行匹配:", reDotAll.MatchString(strWithLine))
|
||
|
||
// 场景3:大小写不敏感匹配(无修饰符,字符组兼容大小写)
|
||
fmt.Println("\n===== 3. 大小写忽略匹配方案 =====")
|
||
target := "Apple APPLE apple aPpLe"
|
||
// 写法1:字符组罗列大小写
|
||
reCase := regexp.MustCompile(`[Aa][Pp][Pp][Ll][Ee]`)
|
||
fmt.Println("大小写全部匹配结果:", reCase.FindAllString(target, -1))
|
||
|
||
// 场景4:CompilePOSIX 天生Longest语义
|
||
fmt.Println("\n===== 4. CompilePOSIX 原生最长匹配 =====")
|
||
rePosix, _ := regexp.CompilePOSIX(expr)
|
||
fmt.Println("CompilePOSIX匹配aaaa:", rePosix.FindString("aaaa"))
|
||
}
|