src/Globber.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$script:Splitter = [Regex]::new("[,\s]+")

function Test-Glob([string] $patternList, [string] $str)  {
    $patterns = $script:Splitter.Split($patternList) | Sort-Object { $_.StartsWith("!") } -Descending

    foreach ($pattern in $patterns) {
        $negate = $pattern[0] -eq '!'

        if ($negate) {
            $pattern = $pattern.Substring(1)
        }

        $pattern = $pattern.Replace(".", "\.").Replace("*", ".*").Replace("?", ".?")
        $result = [Regex]::new('^(?:' + $pattern + ')$').IsMatch($str)

        if ($negate -and $result) {
            return $false;
        }

        if ($result) {
            return $true;
        }
    }

    return $false;
}