4 Repetition
Repetition allows for a single expression to match more than once, or not at all. There are multiple ways in which repetition may be indicated, using explicit procedures, using the #:repeat argument on group procedures, or the more specific arguments to the rx/repeat procedure. These options are compared in the following table.
| rx/... | 
 | #:repeat | 
 | rx/repeat | 
| rx/optional | 
 | ’optional | 
 | #:lower 0 #:upper 1 | 
| rx/zero-or-more | 
 | ’zero-or-more | 
 | #:lower 0 #:upper #f | 
| rx/one-or-more | 
 | ’one-or-more | 
 | #:lower 1 #:upper #f | 
| N/A | 
 | ’one | 
 | #:lower 1 #:upper 1 | 
> (rx/optional "maybe") "maybe?"
> (rx/? "maybe") "maybe?"
procedure
(rx/zero-or-more expr) → string?
expr : string? 
procedure
expr : string? 
> (rx/zero-or-more "maybe") "maybe*"
> (rx/* "maybe") "maybe*"
procedure
(rx/one-or-more expr) → string?
expr : string? 
procedure
expr : string? 
> (rx/one-or-more "maybe") "maybe+"
> (rx/+ "maybe") "maybe+"
procedure
expr : string? lower : (or/c exact-nonnegative-integer? #f) = #f upper : (or/c exact-nonnegative-integer? #f) = #f 
> (rx/repeat "maybe" #:lower 1) "maybe{1,}"
> (rx/repeat "maybe" #:upper 1) "maybe{,1}"
> (rx/repeat "maybe" #:lower 1 #:upper 3) "maybe{1,3}"
> (rx/repeat "maybe" #:lower 3 #:upper 1) upper: contract violation
expected: >= 3
given: 1
> (rx/repeat "maybe") upper: contract violation
expected: or/c #f #f
given: '(#f #f)
procedure
(rx/repeat-safe? expr) → boolean?
expr : string? 
> (rx/repeat-safe? #\a) #t
> (rx/repeat-safe? "(abc)") #t
> (rx/repeat-safe? "[abc]") #t
> (rx/repeat-safe? "maybe") #f
procedure
(rx/repeat-safely expr [ #:lower lower #:upper upper]) → string? expr : string? lower : exact-nonnegative-integer? = 0 upper : (or/c exact-nonnegative-integer? #f) = #f 
> (rx/repeat-safely #\a #:lower 1 #:upper 3) "a{1,3}"
> (rx/repeat-safely "(abc)" #:lower 1 #:upper 3) "(abc){1,3}"
> (rx/repeat-safely "[abc]" #:lower 1 #:upper 3) "[abc]{1,3}"
> (rx/repeat-safely "maybe" #:lower 1 #:upper 3) "(?:maybe){1,3}"