[#boost-urls-grammar-range_rule-00]
= xref:boost.adoc[boost]::xref:boost/urls.adoc[urls]::xref:boost/urls/grammar.adoc[grammar]::range&lowbar;rule
:relfileprefix: ../../../
:mrdocs:

Match a repeating number of elements

== Synopsis

Declared in `&lt;https://www.github.com/boostorg/url/blob/develop/include/boost/url/grammar/range_rule.hpp#L397[boost&sol;url&sol;grammar&sol;range&lowbar;rule&period;hpp]&gt;`

[source,cpp,subs="verbatim,replacements,macros,-callouts"]
----
template&lt;xref:boost/urls/grammar/Rule.adoc[Rule] R&gt;
constexpr
&sol;&ast; implementation-defined &ast;&sol;
range&lowbar;rule(
    R const& next,
    std::size&lowbar;t N = 0,
    std::size&lowbar;t M = std&colon;&colon;size&lowbar;t(&hyphen;1)) noexcept;
----

== Description

Elements are matched using the passed rule&period; Normally when the rule returns an error, the range ends and the input is rewound to one past the last character that matched successfully&period; However, if the rule returns the special value xref:boost/urls/grammar/error.adoc[`error&colon;&colon;end&lowbar;of&lowbar;range`], the input is not rewound&period; This allows for rules which consume input without producing elements in the range&period; For example, to relax the grammar for a comma&hyphen;delimited list by allowing extra commas in between elements&period;

== Value Type

[,cpp]
----
using value_type = range< typename Rule::value_type >;
----
== Example

Rules are used with the function xref:boost/urls/grammar/parse-09.adoc[`parse`]&period;

[,cpp]
----
// range    = 1*( ";" token )

system::result< range<core::string_view> > rv = parse( ";alpha;xray;charlie",
    range_rule(
        tuple_rule(
            squelch( delim_rule( ';' ) ),
            token_rule( alpha_chars ) ),
        1 ) );
----
== BNF

[,cpp]
----
range        = <N>*<M>next
----
== Specification

* https://datatracker.ietf.org/doc/html/rfc5234#section-3.6[3&period;6&period;  Variable Repetition (rfc5234)]

== Return Value

A rule that matches the range&period;

== Parameters

[cols="1,4"]
|===
|Name|Description

| *next*
| The rule to use for matching each element&period; The range extends until this rule returns an error&period;
| *N*
| The minimum number of elements for the range to be valid&period; If omitted, this defaults to zero&period;
| *M*
| The maximum number of elements for the range to be valid&period; If omitted, this defaults to unlimited&period;
|===

== See Also

xref:boost/urls/grammar/alpha_chars.adoc[`alpha&lowbar;chars`], xref:boost/urls/grammar/delim_rule-0a.adoc[`delim&lowbar;rule`], xref:boost/urls/grammar/error.adoc[`error&colon;&colon;end&lowbar;of&lowbar;range`], xref:boost/urls/grammar/parse-09.adoc[`parse`], xref:boost/urls/grammar/range.adoc[`range`], xref:boost/urls/grammar/tuple_rule.adoc[`tuple&lowbar;rule`], xref:boost/urls/grammar/squelch.adoc[`squelch`]&period;


[.small]#Created with https://www.mrdocs.com[MrDocs]#
