github.com/mithrandie/csvq@v1.18.1/lib/query/regexp.go (about) 1 package query 2 3 import ( 4 "fmt" 5 "regexp" 6 ) 7 8 var validFlagsRegExp = regexp.MustCompile("[imsU]+") 9 10 var RegExps = NewRegExpMap() 11 12 type RegExpMap struct { 13 *SyncMap 14 } 15 16 func NewRegExpMap() RegExpMap { 17 return RegExpMap{ 18 NewSyncMap(), 19 } 20 } 21 22 func (rem RegExpMap) Store(key string, value *regexp.Regexp) { 23 rem.store(key, value) 24 } 25 26 func (rem RegExpMap) Load(key string) (*regexp.Regexp, bool) { 27 v, ok := rem.load(key) 28 if ok { 29 return v.(*regexp.Regexp), ok 30 } 31 return nil, ok 32 } 33 34 func (rem RegExpMap) Get(expr string) (*regexp.Regexp, error) { 35 if v, ok := rem.Load(expr); ok { 36 return v, nil 37 } 38 39 rem.lock() 40 defer rem.unlock() 41 42 if v, ok := rem.Load(expr); ok { 43 return v, nil 44 } 45 46 re, err := regexp.Compile(expr) 47 if err != nil { 48 return nil, fmt.Errorf("failed to compile pattern %q", expr) 49 } 50 51 rem.Store(expr, re) 52 return re, nil 53 }