glob

package module
v0.2.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 8, 2018 License: MIT Imports: 2 Imported by: 1,648

README

glob.go

GoDoc Build Status

Go Globbing Library.

Install

    go get github.com/gobwas/glob

Example


package main

import "github.com/gobwas/glob"

func main() {
    var g glob.Glob
    
    // create simple glob
    g = glob.MustCompile("*.github.com")
    g.Match("api.github.com") // true
    
    // quote meta characters and then create simple glob 
    g = glob.MustCompile(glob.QuoteMeta("*.github.com"))
    g.Match("*.github.com") // true
    
    // create new glob with set of delimiters as ["."]
    g = glob.MustCompile("api.*.com", '.')
    g.Match("api.github.com") // true
    g.Match("api.gi.hub.com") // false
    
    // create new glob with set of delimiters as ["."]
    // but now with super wildcard
    g = glob.MustCompile("api.**.com", '.')
    g.Match("api.github.com") // true
    g.Match("api.gi.hub.com") // true
        
    // create glob with single symbol wildcard
    g = glob.MustCompile("?at")
    g.Match("cat") // true
    g.Match("fat") // true
    g.Match("at") // false
    
    // create glob with single symbol wildcard and delimiters ['f']
    g = glob.MustCompile("?at", 'f')
    g.Match("cat") // true
    g.Match("fat") // false
    g.Match("at") // false 
    
    // create glob with character-list matchers 
    g = glob.MustCompile("[abc]at")
    g.Match("cat") // true
    g.Match("bat") // true
    g.Match("fat") // false
    g.Match("at") // false
    
    // create glob with character-list matchers 
    g = glob.MustCompile("[!abc]at")
    g.Match("cat") // false
    g.Match("bat") // false
    g.Match("fat") // true
    g.Match("at") // false 
    
    // create glob with character-range matchers 
    g = glob.MustCompile("[a-c]at")
    g.Match("cat") // true
    g.Match("bat") // true
    g.Match("fat") // false
    g.Match("at") // false
    
    // create glob with character-range matchers 
    g = glob.MustCompile("[!a-c]at")
    g.Match("cat") // false
    g.Match("bat") // false
    g.Match("fat") // true
    g.Match("at") // false 
    
    // create glob with pattern-alternatives list 
    g = glob.MustCompile("{cat,bat,[fr]at}")
    g.Match("cat") // true
    g.Match("bat") // true
    g.Match("fat") // true
    g.Match("rat") // true
    g.Match("at") // false 
    g.Match("zat") // false 
}

Performance

This library is created for compile-once patterns. This means, that compilation could take time, but strings matching is done faster, than in case when always parsing template.

If you will not use compiled glob.Glob object, and do g := glob.MustCompile(pattern); g.Match(...) every time, then your code will be much more slower.

Run go test -bench=. from source root to see the benchmarks:

Pattern Fixture Match Speed (ns/op)
[a-z][!a-x]*cat*[h][!b]*eyes* my cat has very bright eyes true 432
[a-z][!a-x]*cat*[h][!b]*eyes* my dog has very bright eyes false 199
https://*.google.* https://account.google.com true 96
https://*.google.* https://google.com false 66
{https://*.google.*,*yandex.*,*yahoo.*,*mail.ru} http://yahoo.com true 163
{https://*.google.*,*yandex.*,*yahoo.*,*mail.ru} http://google.com false 197
{https://*gobwas.com,http://exclude.gobwas.com} https://safe.gobwas.com true 22
{https://*gobwas.com,http://exclude.gobwas.com} http://safe.gobwas.com false 24
abc* abcdef true 8.15
abc* af false 5.68
*def abcdef true 8.84
*def af false 5.74
ab*ef abcdef true 15.2
ab*ef af false 10.4

The same things with regexp package:

Pattern Fixture Match Speed (ns/op)
^[a-z][^a-x].*cat.*[h][^b].*eyes.*$ my cat has very bright eyes true 2553
^[a-z][^a-x].*cat.*[h][^b].*eyes.*$ my dog has very bright eyes false 1383
^https:\/\/.*\.google\..*$ https://account.google.com true 1205
^https:\/\/.*\.google\..*$ https://google.com false 767
`^(https://..google.. .yandex.. .yahoo.. .*mail.ru)$`
`^(https://..google.. .yandex.. .yahoo.. .*mail.ru)$`
`^(https://.*gobwas.com http://exclude.gobwas.com)$` https://safe.gobwas.com true
`^(https://.*gobwas.com http://exclude.gobwas.com)$` http://safe.gobwas.com false
^abc.*$ abcdef true 237
^abc.*$ af false 100
^.*def$ abcdef true 464
^.*def$ af false 265
^ab.*ef$ abcdef true 375
^ab.*ef$ af false 145

Syntax

Syntax is inspired by standard wildcards, except that ** is aka super-asterisk, that do not sensitive for separators.

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func QuoteMeta

func QuoteMeta(s string) string

QuoteMeta returns a string that quotes all glob pattern meta characters inside the argument text; For example, QuoteMeta(`{foo*}`) returns `\[foo\*\]`.

Types

type Glob

type Glob interface {
	Match(string) bool
}

Glob represents compiled glob pattern.

func Compile

func Compile(pattern string, separators ...rune) (Glob, error)

Compile creates Glob for given pattern and strings (if any present after pattern) as separators. The pattern syntax is:

pattern:
    { term }

term:
    `*`         matches any sequence of non-separator characters
    `**`        matches any sequence of characters
    `?`         matches any single non-separator character
    `[` [ `!` ] { character-range } `]`
                character class (must be non-empty)
    `{` pattern-list `}`
                pattern alternatives
    c           matches character c (c != `*`, `**`, `?`, `\`, `[`, `{`, `}`)
    `\` c       matches character c

character-range:
    c           matches character c (c != `\\`, `-`, `]`)
    `\` c       matches character c
    lo `-` hi   matches character c for lo <= c <= hi

pattern-list:
    pattern { `,` pattern }
                comma-separated (without spaces) patterns

func MustCompile

func MustCompile(pattern string, separators ...rune) Glob

MustCompile is the same as Compile, except that if Compile returns error, this will panic

Directories

Path Synopsis
cmd
ast
util

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL