33 shared_ptr<RegexBackrefManager> backrefManager,
35 :
RegexMatcher(expr, EXPR_REPEAT_PATTERN, std::move(backrefManager))
36 , m_indicator(indicator)
42 RegexRepeatMatcher::compile()
45 auto matcher = make_shared<RegexBackrefMatcher>(
m_expr.substr(0, m_indicator),
52 m_matchers.push_back(make_shared<RegexComponentSetMatcher>(
m_expr.substr(0, m_indicator),
60 RegexRepeatMatcher::parseRepetition()
62 constexpr
size_t MAX_REPETITIONS = std::numeric_limits<size_t>::max();
63 size_t exprSize =
m_expr.size();
65 if (exprSize == m_indicator) {
69 else if (exprSize == m_indicator + 1) {
70 switch (
m_expr[m_indicator]) {
77 m_repeatMax = MAX_REPETITIONS;
81 m_repeatMax = MAX_REPETITIONS;
88 std::string repeatStruct =
m_expr.substr(m_indicator, exprSize - m_indicator);
89 size_t rsSize = repeatStruct.size();
92 if (std::regex_match(repeatStruct, std::regex(
"\\{[0-9]+,[0-9]+\\}"))) {
93 size_t separator = repeatStruct.find_first_of(
',', 0);
94 m_repeatMin = std::stoul(repeatStruct.substr(1, separator - 1));
95 m_repeatMax = std::stoul(repeatStruct.substr(separator + 1, rsSize - separator - 2));
96 if (m_repeatMin > m_repeatMax) {
97 NDN_THROW(Error(
"Invalid number of repetitions '" + repeatStruct +
"' in regex: " +
m_expr));
100 else if (std::regex_match(repeatStruct, std::regex(
"\\{,[0-9]+\\}"))) {
101 size_t separator = repeatStruct.find_first_of(
',', 0);
103 m_repeatMax = std::stoul(repeatStruct.substr(separator + 1, rsSize - separator - 2));
105 else if (std::regex_match(repeatStruct, std::regex(
"\\{[0-9]+,\\}"))) {
106 size_t separator = repeatStruct.find_first_of(
',', 0);
107 m_repeatMin = std::stoul(repeatStruct.substr(1, separator));
108 m_repeatMax = MAX_REPETITIONS;
110 else if (std::regex_match(repeatStruct, std::regex(
"\\{[0-9]+\\}"))) {
111 m_repeatMin = std::stoul(repeatStruct.substr(1, rsSize - 1));
112 m_repeatMax = m_repeatMin;
115 NDN_THROW(Error(
"Invalid quantifier '" + repeatStruct +
"' in regex: " +
m_expr));
119 catch (
const std::logic_error&) {
130 if (m_repeatMin == 0 && len == 0) {
134 if (recursiveMatch(0, name, offset, len)) {
135 for (
size_t i = offset; i < offset + len; i++) {
145 RegexRepeatMatcher::recursiveMatch(
size_t repeat,
const Name& name,
size_t offset,
size_t len)
147 if (0 < len && repeat >= m_repeatMax) {
151 if (0 == len && repeat < m_repeatMin) {
155 if (0 == len && repeat >= m_repeatMin) {
160 ssize_t tried =
static_cast<ssize_t
>(len);
162 if (matcher->match(name, offset, tried) &&
163 recursiveMatch(repeat + 1, name, offset + tried, len - tried)) {
Represents an absolute name.
const Component & get(ssize_t i) const noexcept
Returns an immutable reference to the component at the specified index.
std::vector< name::Component > m_matchResult
shared_ptr< RegexBackrefManager > m_backrefManager
std::vector< shared_ptr< RegexMatcher > > m_matchers
bool match(const Name &name, size_t offset, size_t len) override
RegexRepeatMatcher(const std::string &expr, shared_ptr< RegexBackrefManager > backrefManager, size_t indicator)
#define NDN_THROW_NESTED(e)