src

Go monorepo.
git clone git://code.dwrz.net/src
Log | Files | Refs

lazyre.go (1871B)


      1 // Copyright 2018 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 // Package lazyregexp is a thin wrapper over regexp, allowing the use of global
      6 // regexp variables without forcing them to be compiled at init.
      7 package lazyregexp
      8 
      9 import (
     10 	"os"
     11 	"regexp"
     12 	"strings"
     13 	"sync"
     14 )
     15 
     16 // Regexp is a wrapper around [regexp.Regexp], where the underlying regexp will be
     17 // compiled the first time it is needed.
     18 type Regexp struct {
     19 	str  string
     20 	once sync.Once
     21 	rx   *regexp.Regexp
     22 }
     23 
     24 func (r *Regexp) re() *regexp.Regexp {
     25 	r.once.Do(r.build)
     26 	return r.rx
     27 }
     28 
     29 func (r *Regexp) build() {
     30 	r.rx = regexp.MustCompile(r.str)
     31 	r.str = ""
     32 }
     33 
     34 func (r *Regexp) FindSubmatch(s []byte) [][]byte {
     35 	return r.re().FindSubmatch(s)
     36 }
     37 
     38 func (r *Regexp) FindStringSubmatch(s string) []string {
     39 	return r.re().FindStringSubmatch(s)
     40 }
     41 
     42 func (r *Regexp) FindStringSubmatchIndex(s string) []int {
     43 	return r.re().FindStringSubmatchIndex(s)
     44 }
     45 
     46 func (r *Regexp) ReplaceAllString(src, repl string) string {
     47 	return r.re().ReplaceAllString(src, repl)
     48 }
     49 
     50 func (r *Regexp) FindString(s string) string {
     51 	return r.re().FindString(s)
     52 }
     53 
     54 func (r *Regexp) FindAllString(s string, n int) []string {
     55 	return r.re().FindAllString(s, n)
     56 }
     57 
     58 func (r *Regexp) MatchString(s string) bool {
     59 	return r.re().MatchString(s)
     60 }
     61 
     62 func (r *Regexp) SubexpNames() []string {
     63 	return r.re().SubexpNames()
     64 }
     65 
     66 var inTest = len(os.Args) > 0 && strings.HasSuffix(strings.TrimSuffix(os.Args[0], ".exe"), ".test")
     67 
     68 // New creates a new lazy regexp, delaying the compiling work until it is first
     69 // needed. If the code is being run as part of tests, the regexp compiling will
     70 // happen immediately.
     71 func New(str string) *Regexp {
     72 	lr := &Regexp{str: str}
     73 	if inTest {
     74 		// In tests, always compile the regexps early.
     75 		lr.re()
     76 	}
     77 	return lr
     78 }