mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2025-12-20 00:50:06 +08:00
Some checks are pending
Test / test (1.20, macos-13) (push) Waiting to run
Test / test (1.20, macos-latest) (push) Waiting to run
Test / test (1.20, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.20, ubuntu-latest) (push) Waiting to run
Test / test (1.20, windows-latest) (push) Waiting to run
Test / test (1.21, macos-13) (push) Waiting to run
Test / test (1.21, macos-latest) (push) Waiting to run
Test / test (1.21, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.21, ubuntu-latest) (push) Waiting to run
Test / test (1.21, windows-latest) (push) Waiting to run
Test / test (1.22, macos-13) (push) Waiting to run
Test / test (1.22, macos-latest) (push) Waiting to run
Test / test (1.22, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.22, ubuntu-latest) (push) Waiting to run
Test / test (1.22, windows-latest) (push) Waiting to run
Test / test (1.23, macos-13) (push) Waiting to run
Test / test (1.23, macos-latest) (push) Waiting to run
Test / test (1.23, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.23, ubuntu-latest) (push) Waiting to run
Test / test (1.23, windows-latest) (push) Waiting to run
Test / test (1.24, macos-13) (push) Waiting to run
Test / test (1.24, macos-latest) (push) Waiting to run
Test / test (1.24, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.24, ubuntu-latest) (push) Waiting to run
Test / test (1.24, windows-latest) (push) Waiting to run
Trigger CMFA Update / trigger-CMFA-update (push) Waiting to run
https://github.com/MetaCubeX/mihomo/issues/2204
85 lines
2.2 KiB
Go
85 lines
2.2 KiB
Go
// Package wildcard modified IGLOU-EU/go-wildcard to support:
|
|
//
|
|
// `*` matches zero or more characters
|
|
// `?` matches exactly one character
|
|
//
|
|
// The original go-wildcard library used `.` to match exactly one character, and `?` to match zero or one character.
|
|
// `.` is a valid delimiter in domain name matching and should not be used as a wildcard.
|
|
// The `?` matching logic strictly matches only one character in most scenarios.
|
|
// So, the `?` matching logic in the original go-wildcard library has been removed and its wildcard `.` has been replaced with `?`.
|
|
package wildcard
|
|
|
|
// copy and modified from https://github.com/IGLOU-EU/go-wildcard/tree/ce22b7af48e487517a492d3727d9386492043e21
|
|
// which is licensed under OpenBSD's ISC-style license.
|
|
// Copyright (c) 2023 Iglou.eu contact@iglou.eu Copyright (c) 2023 Adrien Kara adrien@iglou.eu
|
|
|
|
func Match(pattern, s string) bool {
|
|
if pattern == "" {
|
|
return s == pattern
|
|
}
|
|
if pattern == "*" || s == pattern {
|
|
return true
|
|
}
|
|
|
|
return matchByString(pattern, s)
|
|
}
|
|
|
|
func matchByString(pattern, s string) bool {
|
|
var patternIndex, sIndex, lastStar int
|
|
patternLen := len(pattern)
|
|
sLen := len(s)
|
|
star := -1
|
|
|
|
Loop:
|
|
if sIndex >= sLen {
|
|
goto checkPattern
|
|
}
|
|
|
|
if patternIndex >= patternLen {
|
|
if star != -1 {
|
|
patternIndex = star + 1
|
|
lastStar++
|
|
sIndex = lastStar
|
|
goto Loop
|
|
}
|
|
return false
|
|
}
|
|
switch pattern[patternIndex] {
|
|
case '?':
|
|
// It matches any single character. So, we don't need to check anything.
|
|
case '*':
|
|
// '*' matches zero or more characters. Store its position and increment the pattern index.
|
|
star = patternIndex
|
|
lastStar = sIndex
|
|
patternIndex++
|
|
goto Loop
|
|
default:
|
|
// If the characters don't match, check if there was a previous '*' to backtrack.
|
|
if pattern[patternIndex] != s[sIndex] {
|
|
if star != -1 {
|
|
patternIndex = star + 1
|
|
lastStar++
|
|
sIndex = lastStar
|
|
goto Loop
|
|
}
|
|
|
|
return false
|
|
}
|
|
}
|
|
|
|
patternIndex++
|
|
sIndex++
|
|
goto Loop
|
|
|
|
// Check if the remaining pattern characters are '*', which can match the end of the string.
|
|
checkPattern:
|
|
if patternIndex < patternLen {
|
|
if pattern[patternIndex] == '*' {
|
|
patternIndex++
|
|
goto checkPattern
|
|
}
|
|
}
|
|
|
|
return patternIndex == patternLen
|
|
}
|