- Notifications
You must be signed in to change notification settings - Fork68
gobwas/glob
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
glob.go
Go Globbing Library.
go get github.com/gobwas/glob
package mainimport"github.com/gobwas/glob"funcmain() {varg glob.Glob// create simple globg=glob.MustCompile("*.github.com")g.Match("api.github.com")// true// quote meta characters and then create simple globg=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")// trueg.Match("api.gi.hub.com")// false// create new glob with set of delimiters as ["."]// but now with super wildcardg=glob.MustCompile("api.**.com",'.')g.Match("api.github.com")// trueg.Match("api.gi.hub.com")// true// create glob with single symbol wildcardg=glob.MustCompile("?at")g.Match("cat")// trueg.Match("fat")// trueg.Match("at")// false// create glob with single symbol wildcard and delimiters ['f']g=glob.MustCompile("?at",'f')g.Match("cat")// trueg.Match("fat")// falseg.Match("at")// false// create glob with character-list matchersg=glob.MustCompile("[abc]at")g.Match("cat")// trueg.Match("bat")// trueg.Match("fat")// falseg.Match("at")// false// create glob with character-list matchersg=glob.MustCompile("[!abc]at")g.Match("cat")// falseg.Match("bat")// falseg.Match("fat")// trueg.Match("at")// false// create glob with character-range matchersg=glob.MustCompile("[a-c]at")g.Match("cat")// trueg.Match("bat")// trueg.Match("fat")// falseg.Match("at")// false// create glob with character-range matchersg=glob.MustCompile("[!a-c]at")g.Match("cat")// falseg.Match("bat")// falseg.Match("fat")// trueg.Match("at")// false// create glob with pattern-alternatives listg=glob.MustCompile("{cat,bat,[fr]at}")g.Match("cat")// trueg.Match("bat")// trueg.Match("fat")// trueg.Match("rat")// trueg.Match("at")// falseg.Match("zat")// false}
This library is created for compile-once patterns. This means, that compilation could take time, butstrings matching is done faster, than in case when always parsing template.
If you will not use compiledglob.Glob
object, and dog := glob.MustCompile(pattern); g.Match(...)
every time, then your code will be much more slower.
Rungo 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 withregexp
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)$ | http://yahoo.com | true | 1435 |
^(https:\/\/.*\.google\..*|.*yandex\..*|.*yahoo\..*|.*mail\.ru)$ | http://google.com | false | 1674 |
^(https:\/\/.*gobwas\.com|http://exclude.gobwas.com)$ | https://safe.gobwas.com | true | 1039 |
^(https:\/\/.*gobwas\.com|http://exclude.gobwas.com)$ | http://safe.gobwas.com | false | 272 |
^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 is inspired bystandard wildcards,except that**
is aka super-asterisk, that do not sensitive for separators.
About
Go glob
Topics
Resources
License
Stars
Watchers
Forks
Packages0
No packages published