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  }