1 // Copyright 2009 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.
5 // Package regexp implements regular expression search.
7 // The syntax of the regular expressions accepted is the same
8 // general syntax used by Perl, Python, and other languages.
9 // More precisely, it is the syntax accepted by RE2 and described at
10 // http://code.google.com/p/re2/wiki/Syntax, except for \C.
12 // All characters are UTF-8-encoded code points.
14 // There are 16 methods of Regexp that match a regular expression and identify
15 // the matched text. Their names are matched by this regular expression:
17 // Find(All)?(String)?(Submatch)?(Index)?
19 // If 'All' is present, the routine matches successive non-overlapping
20 // matches of the entire expression. Empty matches abutting a preceding
21 // match are ignored. The return value is a slice containing the successive
22 // return values of the corresponding non-'All' routine. These routines take
23 // an extra integer argument, n; if n >= 0, the function returns at most n
24 // matches/submatches.
26 // If 'String' is present, the argument is a string; otherwise it is a slice
27 // of bytes; return values are adjusted as appropriate.
29 // If 'Submatch' is present, the return value is a slice identifying the
30 // successive submatches of the expression. Submatches are matches of
31 // parenthesized subexpressions within the regular expression, numbered from
32 // left to right in order of opening parenthesis. Submatch 0 is the match of
33 // the entire expression, submatch 1 the match of the first parenthesized
34 // subexpression, and so on.
36 // If 'Index' is present, matches and submatches are identified by byte index
37 // pairs within the input string: result[2*n:2*n+1] identifies the indexes of
38 // the nth submatch. The pair for n==0 identifies the match of the entire
39 // expression. If 'Index' is not present, the match is identified by the
40 // text of the match/submatch. If an index is negative, it means that
41 // subexpression did not match any string in the input.
43 // There is also a subset of the methods that can be applied to text read
46 // MatchReader, FindReaderIndex, FindReaderSubmatchIndex
48 // This set may grow. Note that regular expression matches may need to
49 // examine text beyond the text returned by a match, so the methods that
50 // match text from a RuneReader may read arbitrarily far into the input
53 // (There are a few other methods that do not match this pattern.)
70 // Regexp is the representation of a compiled regular expression.
71 // The public interface is entirely through methods.
72 // A Regexp is safe for concurrent use by multiple goroutines.
74 // read-only after Compile
75 expr string // as passed to Compile
76 prog *syntax.Prog // compiled program
77 prefix string // required prefix in unanchored matches
78 prefixBytes []byte // prefix, as a []byte
79 prefixComplete bool // prefix is the entire regexp
80 prefixRune rune // first rune in prefix
81 cond syntax.EmptyOp // empty-width conditions required at start of match
86 // cache of machines for running regexp
91 // String returns the source text used to compile the regular expression.
92 func (re *Regexp) String() string {
96 // Compile parses a regular expression and returns, if successful,
97 // a Regexp object that can be used to match against text.
99 // When matching against text, the regexp returns a match that
100 // begins as early as possible in the input (leftmost), and among those
101 // it chooses the one that a backtracking search would have found first.
102 // This so-called leftmost-first matching is the same semantics
103 // that Perl, Python, and other implementations use, although this
104 // package implements it without the expense of backtracking.
105 // For POSIX leftmost-longest matching, see CompilePOSIX.
106 func Compile(expr string) (*Regexp, error) {
107 return compile(expr, syntax.Perl, false)
110 // CompilePOSIX is like Compile but restricts the regular expression
111 // to POSIX ERE (egrep) syntax and changes the match semantics to
114 // That is, when matching against text, the regexp returns a match that
115 // begins as early as possible in the input (leftmost), and among those
116 // it chooses a match that is as long as possible.
117 // This so-called leftmost-longest matching is the same semantics
118 // that early regular expression implementations used and that POSIX
121 // However, there can be multiple leftmost-longest matches, with different
122 // submatch choices, and here this package diverges from POSIX.
123 // Among the possible leftmost-longest matches, this package chooses
124 // the one that a backtracking search would have found first, while POSIX
125 // specifies that the match be chosen to maximize the length of the first
126 // subexpression, then the second, and so on from left to right.
127 // The POSIX rule is computationally prohibitive and not even well-defined.
128 // See http://swtch.com/~rsc/regexp/regexp2.html#posix for details.
129 func CompilePOSIX(expr string) (*Regexp, error) {
130 return compile(expr, syntax.POSIX, true)
133 func compile(expr string, mode syntax.Flags, longest bool) (*Regexp, error) {
134 re, err := syntax.Parse(expr, mode)
138 maxCap := re.MaxCap()
139 capNames := re.CapNames()
142 prog, err := syntax.Compile(re)
150 subexpNames: capNames,
151 cond: prog.StartCond(),
154 regexp.prefix, regexp.prefixComplete = prog.Prefix()
155 if regexp.prefix != "" {
156 // TODO(rsc): Remove this allocation by adding
157 // IndexString to package bytes.
158 regexp.prefixBytes = []byte(regexp.prefix)
159 regexp.prefixRune, _ = utf8.DecodeRuneInString(regexp.prefix)
164 // get returns a machine to use for matching re.
165 // It uses the re's machine cache if possible, to avoid
166 // unnecessary allocation.
167 func (re *Regexp) get() *machine {
169 if n := len(re.machine); n > 0 {
171 re.machine = re.machine[:n-1]
176 z := progMachine(re.prog)
181 // put returns a machine to the re's machine cache.
182 // There is no attempt to limit the size of the cache, so it will
183 // grow to the maximum number of simultaneous matches
184 // run using re. (The cache empties when re gets garbage collected.)
185 func (re *Regexp) put(z *machine) {
187 re.machine = append(re.machine, z)
191 // MustCompile is like Compile but panics if the expression cannot be parsed.
192 // It simplifies safe initialization of global variables holding compiled regular
194 func MustCompile(str string) *Regexp {
195 regexp, error := Compile(str)
197 panic(`regexp: Compile(` + quote(str) + `): ` + error.Error())
202 // MustCompilePOSIX is like CompilePOSIX but panics if the expression cannot be parsed.
203 // It simplifies safe initialization of global variables holding compiled regular
205 func MustCompilePOSIX(str string) *Regexp {
206 regexp, error := CompilePOSIX(str)
208 panic(`regexp: CompilePOSIX(` + quote(str) + `): ` + error.Error())
213 func quote(s string) string {
214 if strconv.CanBackquote(s) {
217 return strconv.Quote(s)
220 // NumSubexp returns the number of parenthesized subexpressions in this Regexp.
221 func (re *Regexp) NumSubexp() int {
225 // SubexpNames returns the names of the parenthesized subexpressions
226 // in this Regexp. The name for the first sub-expression is names[1],
227 // so that if m is a match slice, the name for m[i] is SubexpNames()[i].
228 // Since the Regexp as a whole cannot be named, names[0] is always
229 // the empty string. The slice should not be modified.
230 func (re *Regexp) SubexpNames() []string {
231 return re.subexpNames
234 const endOfText rune = -1
236 // input abstracts different representations of the input text. It provides
237 // one-character lookahead.
238 type input interface {
239 step(pos int) (r rune, width int) // advance one rune
240 canCheckPrefix() bool // can we look ahead without losing info?
241 hasPrefix(re *Regexp) bool
242 index(re *Regexp, pos int) int
243 context(pos int) syntax.EmptyOp
246 // inputString scans a string.
247 type inputString struct {
251 func (i *inputString) step(pos int) (rune, int) {
252 if pos < len(i.str) {
254 if c < utf8.RuneSelf {
257 return utf8.DecodeRuneInString(i.str[pos:])
262 func (i *inputString) canCheckPrefix() bool {
266 func (i *inputString) hasPrefix(re *Regexp) bool {
267 return strings.HasPrefix(i.str, re.prefix)
270 func (i *inputString) index(re *Regexp, pos int) int {
271 return strings.Index(i.str[pos:], re.prefix)
274 func (i *inputString) context(pos int) syntax.EmptyOp {
275 r1, r2 := endOfText, endOfText
276 if pos > 0 && pos <= len(i.str) {
277 r1, _ = utf8.DecodeLastRuneInString(i.str[:pos])
279 if pos < len(i.str) {
280 r2, _ = utf8.DecodeRuneInString(i.str[pos:])
282 return syntax.EmptyOpContext(r1, r2)
285 // inputBytes scans a byte slice.
286 type inputBytes struct {
290 func (i *inputBytes) step(pos int) (rune, int) {
291 if pos < len(i.str) {
293 if c < utf8.RuneSelf {
296 return utf8.DecodeRune(i.str[pos:])
301 func (i *inputBytes) canCheckPrefix() bool {
305 func (i *inputBytes) hasPrefix(re *Regexp) bool {
306 return bytes.HasPrefix(i.str, re.prefixBytes)
309 func (i *inputBytes) index(re *Regexp, pos int) int {
310 return bytes.Index(i.str[pos:], re.prefixBytes)
313 func (i *inputBytes) context(pos int) syntax.EmptyOp {
314 r1, r2 := endOfText, endOfText
315 if pos > 0 && pos <= len(i.str) {
316 r1, _ = utf8.DecodeLastRune(i.str[:pos])
318 if pos < len(i.str) {
319 r2, _ = utf8.DecodeRune(i.str[pos:])
321 return syntax.EmptyOpContext(r1, r2)
324 // inputReader scans a RuneReader.
325 type inputReader struct {
331 func (i *inputReader) step(pos int) (rune, int) {
332 if !i.atEOT && pos != i.pos {
336 r, w, err := i.r.ReadRune()
345 func (i *inputReader) canCheckPrefix() bool {
349 func (i *inputReader) hasPrefix(re *Regexp) bool {
353 func (i *inputReader) index(re *Regexp, pos int) int {
357 func (i *inputReader) context(pos int) syntax.EmptyOp {
361 // LiteralPrefix returns a literal string that must begin any match
362 // of the regular expression re. It returns the boolean true if the
363 // literal string comprises the entire regular expression.
364 func (re *Regexp) LiteralPrefix() (prefix string, complete bool) {
365 return re.prefix, re.prefixComplete
368 // MatchReader returns whether the Regexp matches the text read by the
369 // RuneReader. The return value is a boolean: true for match, false for no
371 func (re *Regexp) MatchReader(r io.RuneReader) bool {
372 return re.doExecute(r, nil, "", 0, 0) != nil
375 // MatchString returns whether the Regexp matches the string s.
376 // The return value is a boolean: true for match, false for no match.
377 func (re *Regexp) MatchString(s string) bool {
378 return re.doExecute(nil, nil, s, 0, 0) != nil
381 // Match returns whether the Regexp matches the byte slice b.
382 // The return value is a boolean: true for match, false for no match.
383 func (re *Regexp) Match(b []byte) bool {
384 return re.doExecute(nil, b, "", 0, 0) != nil
387 // MatchReader checks whether a textual regular expression matches the text
388 // read by the RuneReader. More complicated queries need to use Compile and
389 // the full Regexp interface.
390 func MatchReader(pattern string, r io.RuneReader) (matched bool, error error) {
391 re, err := Compile(pattern)
395 return re.MatchReader(r), nil
398 // MatchString checks whether a textual regular expression
399 // matches a string. More complicated queries need
400 // to use Compile and the full Regexp interface.
401 func MatchString(pattern string, s string) (matched bool, error error) {
402 re, err := Compile(pattern)
406 return re.MatchString(s), nil
409 // Match checks whether a textual regular expression
410 // matches a byte slice. More complicated queries need
411 // to use Compile and the full Regexp interface.
412 func Match(pattern string, b []byte) (matched bool, error error) {
413 re, err := Compile(pattern)
417 return re.Match(b), nil
420 // ReplaceAllString returns a copy of src, replacing matches of the Regexp
421 // with the replacement string repl. Inside repl, $ signs are interpreted as
422 // in Expand, so for instance $1 represents the text of the first submatch.
423 func (re *Regexp) ReplaceAllString(src, repl string) string {
425 if strings.Index(repl, "$") >= 0 {
426 n = 2 * (re.numSubexp + 1)
428 b := re.replaceAll(nil, src, n, func(dst []byte, match []int) []byte {
429 return re.expand(dst, repl, nil, src, match)
434 // ReplaceAllStringLiteral returns a copy of src, replacing matches of the Regexp
435 // with the replacement string repl. The replacement repl is substituted directly,
436 // without using Expand.
437 func (re *Regexp) ReplaceAllLiteralString(src, repl string) string {
438 return string(re.replaceAll(nil, src, 2, func(dst []byte, match []int) []byte {
439 return append(dst, repl...)
443 // ReplaceAllStringFunc returns a copy of src in which all matches of the
444 // Regexp have been replaced by the return value of function repl applied
445 // to the matched substring. The replacement returned by repl is substituted
446 // directly, without using Expand.
447 func (re *Regexp) ReplaceAllStringFunc(src string, repl func(string) string) string {
448 b := re.replaceAll(nil, src, 2, func(dst []byte, match []int) []byte {
449 return append(dst, repl(src[match[0]:match[1]])...)
454 func (re *Regexp) replaceAll(bsrc []byte, src string, nmatch int, repl func(dst []byte, m []int) []byte) []byte {
455 lastMatchEnd := 0 // end position of the most recent match
456 searchPos := 0 // position where we next look for a match
464 for searchPos <= endPos {
465 a := re.doExecute(nil, bsrc, src, searchPos, nmatch)
467 break // no more matches
470 // Copy the unmatched characters before this match.
472 buf = append(buf, bsrc[lastMatchEnd:a[0]]...)
474 buf = append(buf, src[lastMatchEnd:a[0]]...)
477 // Now insert a copy of the replacement string, but not for a
478 // match of the empty string immediately after another match.
479 // (Otherwise, we get double replacement for patterns that
480 // match both empty and nonempty strings.)
481 if a[1] > lastMatchEnd || a[0] == 0 {
486 // Advance past this match; always advance at least one character.
489 _, width = utf8.DecodeRune(bsrc[searchPos:])
491 _, width = utf8.DecodeRuneInString(src[searchPos:])
493 if searchPos+width > a[1] {
495 } else if searchPos+1 > a[1] {
496 // This clause is only needed at the end of the input
497 // string. In that case, DecodeRuneInString returns width=0.
504 // Copy the unmatched characters after the last match.
506 buf = append(buf, bsrc[lastMatchEnd:]...)
508 buf = append(buf, src[lastMatchEnd:]...)
514 // ReplaceAll returns a copy of src, replacing matches of the Regexp
515 // with the replacement text repl. Inside repl, $ signs are interpreted as
516 // in Expand, so for instance $1 represents the text of the first submatch.
517 func (re *Regexp) ReplaceAll(src, repl []byte) []byte {
519 if bytes.IndexByte(repl, '$') >= 0 {
520 n = 2 * (re.numSubexp + 1)
523 b := re.replaceAll(src, "", n, func(dst []byte, match []int) []byte {
524 if len(srepl) != len(repl) {
527 return re.expand(dst, srepl, src, "", match)
532 // ReplaceAllLiteral returns a copy of src, replacing matches of the Regexp
533 // with the replacement bytes repl. The replacement repl is substituted directly,
534 // without using Expand.
535 func (re *Regexp) ReplaceAllLiteral(src, repl []byte) []byte {
536 return re.replaceAll(src, "", 2, func(dst []byte, match []int) []byte {
537 return append(dst, repl...)
541 // ReplaceAllFunc returns a copy of src in which all matches of the
542 // Regexp have been replaced by the return value of function repl applied
543 // to the matched byte slice. The replacement returned by repl is substituted
544 // directly, without using Expand.
545 func (re *Regexp) ReplaceAllFunc(src []byte, repl func([]byte) []byte) []byte {
546 return re.replaceAll(src, "", 2, func(dst []byte, match []int) []byte {
547 return append(dst, repl(src[match[0]:match[1]])...)
551 var specialBytes = []byte(`\.+*?()|[]{}^$`)
553 func special(b byte) bool {
554 return bytes.IndexByte(specialBytes, b) >= 0
557 // QuoteMeta returns a string that quotes all regular expression metacharacters
558 // inside the argument text; the returned string is a regular expression matching
559 // the literal text. For example, QuoteMeta(`[foo]`) returns `\[foo\]`.
560 func QuoteMeta(s string) string {
561 b := make([]byte, 2*len(s))
563 // A byte loop is correct because all metacharacters are ASCII.
565 for i := 0; i < len(s); i++ {
573 return string(b[0:j])
576 // The number of capture values in the program may correspond
577 // to fewer capturing expressions than are in the regexp.
578 // For example, "(a){0}" turns into an empty program, so the
579 // maximum capture in the program is 0 but we need to return
580 // an expression for \1. Pad appends -1s to the slice a as needed.
581 func (re *Regexp) pad(a []int) []int {
586 n := (1 + re.numSubexp) * 2
593 // Find matches in slice b if b is non-nil, otherwise find matches in string s.
594 func (re *Regexp) allMatches(s string, b []byte, n int, deliver func([]int)) {
602 for pos, i, prevMatchEnd := 0, 0, -1; i < n && pos <= end; {
603 matches := re.doExecute(nil, b, s, pos, re.prog.NumCap)
604 if len(matches) == 0 {
609 if matches[1] == pos {
610 // We've found an empty match.
611 if matches[0] == prevMatchEnd {
612 // We don't allow an empty match right
613 // after a previous match, so ignore it.
619 _, width = utf8.DecodeRuneInString(s[pos:end])
621 _, width = utf8.DecodeRune(b[pos:end])
631 prevMatchEnd = matches[1]
634 deliver(re.pad(matches))
640 // Find returns a slice holding the text of the leftmost match in b of the regular expression.
641 // A return value of nil indicates no match.
642 func (re *Regexp) Find(b []byte) []byte {
643 a := re.doExecute(nil, b, "", 0, 2)
650 // FindIndex returns a two-element slice of integers defining the location of
651 // the leftmost match in b of the regular expression. The match itself is at
653 // A return value of nil indicates no match.
654 func (re *Regexp) FindIndex(b []byte) (loc []int) {
655 a := re.doExecute(nil, b, "", 0, 2)
662 // FindString returns a string holding the text of the leftmost match in s of the regular
663 // expression. If there is no match, the return value is an empty string,
664 // but it will also be empty if the regular expression successfully matches
665 // an empty string. Use FindStringIndex or FindStringSubmatch if it is
666 // necessary to distinguish these cases.
667 func (re *Regexp) FindString(s string) string {
668 a := re.doExecute(nil, nil, s, 0, 2)
675 // FindStringIndex returns a two-element slice of integers defining the
676 // location of the leftmost match in s of the regular expression. The match
677 // itself is at s[loc[0]:loc[1]].
678 // A return value of nil indicates no match.
679 func (re *Regexp) FindStringIndex(s string) (loc []int) {
680 a := re.doExecute(nil, nil, s, 0, 2)
687 // FindReaderIndex returns a two-element slice of integers defining the
688 // location of the leftmost match of the regular expression in text read from
689 // the RuneReader. The match text was found in the input stream at
690 // byte offset loc[0] through loc[1]-1.
691 // A return value of nil indicates no match.
692 func (re *Regexp) FindReaderIndex(r io.RuneReader) (loc []int) {
693 a := re.doExecute(r, nil, "", 0, 2)
700 // FindSubmatch returns a slice of slices holding the text of the leftmost
701 // match of the regular expression in b and the matches, if any, of its
702 // subexpressions, as defined by the 'Submatch' descriptions in the package
704 // A return value of nil indicates no match.
705 func (re *Regexp) FindSubmatch(b []byte) [][]byte {
706 a := re.doExecute(nil, b, "", 0, re.prog.NumCap)
710 ret := make([][]byte, 1+re.numSubexp)
712 if 2*i < len(a) && a[2*i] >= 0 {
713 ret[i] = b[a[2*i]:a[2*i+1]]
719 // Expand appends template to dst and returns the result; during the
720 // append, Expand replaces variables in the template with corresponding
721 // matches drawn from src. The match slice should have been returned by
722 // FindSubmatchIndex.
724 // In the template, a variable is denoted by a substring of the form
725 // $name or ${name}, where name is a non-empty sequence of letters,
726 // digits, and underscores. A purely numeric name like $1 refers to
727 // the submatch with the corresponding index; other names refer to
728 // capturing parentheses named with the (?P<name>...) syntax. A
729 // reference to an out of range or unmatched index or a name that is not
730 // present in the regular expression is replaced with an empty slice.
732 // In the $name form, name is taken to be as long as possible: $1x is
733 // equivalent to ${1x}, not ${1}x, and, $10 is equivalent to ${10}, not ${1}0.
735 // To insert a literal $ in the output, use $$ in the template.
736 func (re *Regexp) Expand(dst []byte, template []byte, src []byte, match []int) []byte {
737 return re.expand(dst, string(template), src, "", match)
740 // ExpandString is like Expand but the template and source are strings.
741 // It appends to and returns a byte slice in order to give the calling
742 // code control over allocation.
743 func (re *Regexp) ExpandString(dst []byte, template string, src string, match []int) []byte {
744 return re.expand(dst, template, nil, src, match)
747 func (re *Regexp) expand(dst []byte, template string, bsrc []byte, src string, match []int) []byte {
748 for len(template) > 0 {
749 i := strings.Index(template, "$")
753 dst = append(dst, template[:i]...)
754 template = template[i:]
755 if len(template) > 1 && template[1] == '$' {
757 dst = append(dst, '$')
758 template = template[2:]
761 name, num, rest, ok := extract(template)
763 // Malformed; treat $ as raw text.
764 dst = append(dst, '$')
765 template = template[1:]
770 if 2*num+1 < len(match) {
772 dst = append(dst, bsrc[match[2*num]:match[2*num+1]]...)
774 dst = append(dst, src[match[2*num]:match[2*num+1]]...)
778 for i, namei := range re.subexpNames {
779 if name == namei && 2*i+1 < len(match) && match[2*i] >= 0 {
781 dst = append(dst, bsrc[match[2*i]:match[2*i+1]]...)
783 dst = append(dst, src[match[2*i]:match[2*i+1]]...)
790 dst = append(dst, template...)
794 // extract returns the name from a leading "$name" or "${name}" in str.
795 // If it is a number, extract returns num set to that number; otherwise num = -1.
796 func extract(str string) (name string, num int, rest string, ok bool) {
797 if len(str) < 2 || str[0] != '$' {
809 rune, size := utf8.DecodeRuneInString(str[i:])
810 if !unicode.IsLetter(rune) && !unicode.IsDigit(rune) && rune != '_' {
816 // empty name is not okay
821 if i >= len(str) || str[i] != '}' {
822 // missing closing brace
830 for i := 0; i < len(name); i++ {
831 if name[i] < '0' || '9' < name[i] || num >= 1e8 {
835 num = num*10 + int(name[i]) - '0'
837 // Disallow leading zeros.
838 if name[0] == '0' && len(name) > 1 {
847 // FindSubmatchIndex returns a slice holding the index pairs identifying the
848 // leftmost match of the regular expression in b and the matches, if any, of
849 // its subexpressions, as defined by the 'Submatch' and 'Index' descriptions
850 // in the package comment.
851 // A return value of nil indicates no match.
852 func (re *Regexp) FindSubmatchIndex(b []byte) []int {
853 return re.pad(re.doExecute(nil, b, "", 0, re.prog.NumCap))
856 // FindStringSubmatch returns a slice of strings holding the text of the
857 // leftmost match of the regular expression in s and the matches, if any, of
858 // its subexpressions, as defined by the 'Submatch' description in the
860 // A return value of nil indicates no match.
861 func (re *Regexp) FindStringSubmatch(s string) []string {
862 a := re.doExecute(nil, nil, s, 0, re.prog.NumCap)
866 ret := make([]string, 1+re.numSubexp)
868 if 2*i < len(a) && a[2*i] >= 0 {
869 ret[i] = s[a[2*i]:a[2*i+1]]
875 // FindStringSubmatchIndex returns a slice holding the index pairs
876 // identifying the leftmost match of the regular expression in s and the
877 // matches, if any, of its subexpressions, as defined by the 'Submatch' and
878 // 'Index' descriptions in the package comment.
879 // A return value of nil indicates no match.
880 func (re *Regexp) FindStringSubmatchIndex(s string) []int {
881 return re.pad(re.doExecute(nil, nil, s, 0, re.prog.NumCap))
884 // FindReaderSubmatchIndex returns a slice holding the index pairs
885 // identifying the leftmost match of the regular expression of text read by
886 // the RuneReader, and the matches, if any, of its subexpressions, as defined
887 // by the 'Submatch' and 'Index' descriptions in the package comment. A
888 // return value of nil indicates no match.
889 func (re *Regexp) FindReaderSubmatchIndex(r io.RuneReader) []int {
890 return re.pad(re.doExecute(r, nil, "", 0, re.prog.NumCap))
893 const startSize = 10 // The size at which to start a slice in the 'All' routines.
895 // FindAll is the 'All' version of Find; it returns a slice of all successive
896 // matches of the expression, as defined by the 'All' description in the
898 // A return value of nil indicates no match.
899 func (re *Regexp) FindAll(b []byte, n int) [][]byte {
903 result := make([][]byte, 0, startSize)
904 re.allMatches("", b, n, func(match []int) {
905 result = append(result, b[match[0]:match[1]])
907 if len(result) == 0 {
913 // FindAllIndex is the 'All' version of FindIndex; it returns a slice of all
914 // successive matches of the expression, as defined by the 'All' description
915 // in the package comment.
916 // A return value of nil indicates no match.
917 func (re *Regexp) FindAllIndex(b []byte, n int) [][]int {
921 result := make([][]int, 0, startSize)
922 re.allMatches("", b, n, func(match []int) {
923 result = append(result, match[0:2])
925 if len(result) == 0 {
931 // FindAllString is the 'All' version of FindString; it returns a slice of all
932 // successive matches of the expression, as defined by the 'All' description
933 // in the package comment.
934 // A return value of nil indicates no match.
935 func (re *Regexp) FindAllString(s string, n int) []string {
939 result := make([]string, 0, startSize)
940 re.allMatches(s, nil, n, func(match []int) {
941 result = append(result, s[match[0]:match[1]])
943 if len(result) == 0 {
949 // FindAllStringIndex is the 'All' version of FindStringIndex; it returns a
950 // slice of all successive matches of the expression, as defined by the 'All'
951 // description in the package comment.
952 // A return value of nil indicates no match.
953 func (re *Regexp) FindAllStringIndex(s string, n int) [][]int {
957 result := make([][]int, 0, startSize)
958 re.allMatches(s, nil, n, func(match []int) {
959 result = append(result, match[0:2])
961 if len(result) == 0 {
967 // FindAllSubmatch is the 'All' version of FindSubmatch; it returns a slice
968 // of all successive matches of the expression, as defined by the 'All'
969 // description in the package comment.
970 // A return value of nil indicates no match.
971 func (re *Regexp) FindAllSubmatch(b []byte, n int) [][][]byte {
975 result := make([][][]byte, 0, startSize)
976 re.allMatches("", b, n, func(match []int) {
977 slice := make([][]byte, len(match)/2)
978 for j := range slice {
980 slice[j] = b[match[2*j]:match[2*j+1]]
983 result = append(result, slice)
985 if len(result) == 0 {
991 // FindAllSubmatchIndex is the 'All' version of FindSubmatchIndex; it returns
992 // a slice of all successive matches of the expression, as defined by the
993 // 'All' description in the package comment.
994 // A return value of nil indicates no match.
995 func (re *Regexp) FindAllSubmatchIndex(b []byte, n int) [][]int {
999 result := make([][]int, 0, startSize)
1000 re.allMatches("", b, n, func(match []int) {
1001 result = append(result, match)
1003 if len(result) == 0 {
1009 // FindAllStringSubmatch is the 'All' version of FindStringSubmatch; it
1010 // returns a slice of all successive matches of the expression, as defined by
1011 // the 'All' description in the package comment.
1012 // A return value of nil indicates no match.
1013 func (re *Regexp) FindAllStringSubmatch(s string, n int) [][]string {
1017 result := make([][]string, 0, startSize)
1018 re.allMatches(s, nil, n, func(match []int) {
1019 slice := make([]string, len(match)/2)
1020 for j := range slice {
1021 if match[2*j] >= 0 {
1022 slice[j] = s[match[2*j]:match[2*j+1]]
1025 result = append(result, slice)
1027 if len(result) == 0 {
1033 // FindAllStringSubmatchIndex is the 'All' version of
1034 // FindStringSubmatchIndex; it returns a slice of all successive matches of
1035 // the expression, as defined by the 'All' description in the package
1037 // A return value of nil indicates no match.
1038 func (re *Regexp) FindAllStringSubmatchIndex(s string, n int) [][]int {
1042 result := make([][]int, 0, startSize)
1043 re.allMatches(s, nil, n, func(match []int) {
1044 result = append(result, match)
1046 if len(result) == 0 {