···137137 case tokBranch:
138138 expr = &Branch{Pattern: text}
139139 case tokText, tokRegex:
140140- q, err := regexpQuery(text, false, false)
140140+ q, err := RegexpQuery(text, false, false)
141141 if err != nil {
142142 return nil, 0, err
143143 }
144144 expr = q
145145 case tokFile:
146146- q, err := regexpQuery(text, false, true)
146146+ q, err := RegexpQuery(text, false, true)
147147 if err != nil {
148148 return nil, 0, err
149149 }
150150 expr = q
151151152152 case tokContent:
153153- q, err := regexpQuery(text, true, false)
153153+ q, err := RegexpQuery(text, true, false)
154154 if err != nil {
155155 return nil, 0, err
156156 }
···168168 return nil, 0, fmt.Errorf("the sym: atom must have an argument")
169169 }
170170171171- q, err := regexpQuery(text, false, false)
171171+ q, err := RegexpQuery(text, false, false)
172172 if err != nil {
173173 return nil, 0, err
174174 }
···230230231231const regexpFlags syntax.Flags = syntax.ClassNL | syntax.PerlX | syntax.UnicodeGroups
232232233233-// regexpQuery parses an atom into either a regular expression, or a
233233+// RegexpQuery parses an atom into either a regular expression, or a
234234// simple substring atom.
235235-func regexpQuery(text string, content, file bool) (Q, error) {
235235+func RegexpQuery(text string, content, file bool) (Q, error) {
236236 var expr Q
237237238238 r, err := syntax.Parse(text, regexpFlags)
···240240 return nil, err
241241 }
242242243243- r = optimizeRegexp(r)
243243+ r = OptimizeRegexp(r, regexpFlags)
244244245245 if r.Op == syntax.OpLiteral {
246246 expr = &Substring{
+6-6
query/regexp.go
···4343 return &newRE
4444}
45454646-// optimizeRegexp converts capturing groups to non-capturing groups.
4646+// OptimizeRegexp converts capturing groups to non-capturing groups.
4747// Returns original input if an error is encountered
4848-func optimizeRegexp(re *syntax.Regexp) *syntax.Regexp {
4949- r := convertCapture(re)
4848+func OptimizeRegexp(re *syntax.Regexp, flags syntax.Flags) *syntax.Regexp {
4949+ r := convertCapture(re, flags)
5050 return r.Simplify()
5151}
52525353-func convertCapture(re *syntax.Regexp) *syntax.Regexp {
5353+func convertCapture(re *syntax.Regexp, flags syntax.Flags) *syntax.Regexp {
5454 if !hasCapture(re) {
5555 return re
5656 }
57575858 // Make a copy so in unlikely event of an error the original can be used as a fallback
5959- r, err := syntax.Parse(re.String(), regexpFlags)
5959+ r, err := syntax.Parse(re.String(), flags)
6060 if err != nil {
6161 log.Printf("failed to copy regexp `%s`: %v", re, err)
6262 return re
···6565 r = uncapture(r)
66666767 // Parse again for new structure to take effect
6868- r, err = syntax.Parse(r.String(), regexpFlags)
6868+ r, err = syntax.Parse(r.String(), flags)
6969 if err != nil {
7070 log.Printf("failed to parse regexp after uncapture `%s`: %v", r, err)
7171 return re
+1-1
query/regexp_test.go
···8686 simplifiedWant := mustParseRE(tt.want).Simplify()
87878888 in := mustParseRE(tt.in)
8989- got := optimizeRegexp(in)
8989+ got := OptimizeRegexp(in, regexpFlags)
90909191 // String comparison as the same Regexp string can have different ASTs
9292 // e.g. optimize of `ba(na){1,2}` == `bana(?:na)?`