24 #ifndef NDN_UTIL_REGEX_REGEX_REPEAT_MATCHER_HPP 25 #define NDN_UTIL_REGEX_REGEX_REPEAT_MATCHER_HPP 27 #include "../../common.hpp" 29 #include <boost/regex.hpp> 39 shared_ptr<RegexBackrefManager> backrefManager,
62 recursiveMatch(
size_t repeat,
64 size_t offset,
size_t len);
81 shared_ptr<RegexBackrefManager> backrefManager,
84 , m_indicator(indicator)
92 shared_ptr<RegexMatcher> matcher;
100 matcher = make_shared<RegexComponentSetMatcher>(
m_expr.substr(0, m_indicator),
109 RegexRepeatMatcher::parseRepetition()
111 size_t exprSize =
m_expr.size();
112 const size_t MAX_REPETITIONS = std::numeric_limits<size_t>::max();
114 if (exprSize == m_indicator) {
121 if (exprSize == (m_indicator + 1)) {
122 if (
'?' ==
m_expr[m_indicator]) {
127 if (
'+' ==
m_expr[m_indicator]) {
129 m_repeatMax = MAX_REPETITIONS;
132 if (
'*' ==
m_expr[m_indicator]) {
134 m_repeatMax = MAX_REPETITIONS;
139 std::string repeatStruct =
m_expr.substr(m_indicator, exprSize - m_indicator);
140 size_t rsSize = repeatStruct.size();
144 if (boost::regex_match(repeatStruct, boost::regex(
"\\{[0-9]+,[0-9]+\\}"))) {
145 size_t separator = repeatStruct.find_first_of(
',', 0);
146 min = atoi(repeatStruct.substr(1, separator - 1).c_str());
147 max = atoi(repeatStruct.substr(separator + 1, rsSize - separator - 2).c_str());
149 else if (boost::regex_match(repeatStruct, boost::regex(
"\\{,[0-9]+\\}"))) {
150 size_t separator = repeatStruct.find_first_of(
',', 0);
152 max = atoi(repeatStruct.substr(separator + 1, rsSize - separator - 2).c_str());
154 else if (boost::regex_match(repeatStruct, boost::regex(
"\\{[0-9]+,\\}"))) {
155 size_t separator = repeatStruct.find_first_of(
',', 0);
156 min = atoi(repeatStruct.substr(1, separator).c_str());
157 max = MAX_REPETITIONS;
159 else if (boost::regex_match(repeatStruct, boost::regex(
"\\{[0-9]+\\}"))) {
160 min = atoi(repeatStruct.substr(1, rsSize - 1).c_str());
164 BOOST_THROW_EXCEPTION(
RegexMatcher::Error(std::string(
"Error: RegexRepeatMatcher.ParseRepetition():")
165 +
" Unrecognized format "+
m_expr));
167 if (min > MAX_REPETITIONS || max > MAX_REPETITIONS || min > max)
168 BOOST_THROW_EXCEPTION(
RegexMatcher::Error(std::string(
"Error: RegexRepeatMatcher.ParseRepetition():")
169 +
" Wrong number " +
m_expr));
185 if (0 == m_repeatMin)
189 if (recursiveMatch(0, name, offset, len))
191 for (
size_t i = offset; i < offset + len; i++)
200 RegexRepeatMatcher::recursiveMatch(
size_t repeat,
const Name&
name,
size_t offset,
size_t len)
203 shared_ptr<RegexMatcher> matcher =
m_matchers[0];
205 if (0 < len && repeat >= m_repeatMax)
210 if (0 == len && repeat < m_repeatMin)
215 if (0 == len && repeat >= m_repeatMin)
222 if (matcher->match(name, offset, tried) &&
223 recursiveMatch(repeat + 1, name, offset + tried, len - tried))
234 #endif // NDN_UTIL_REGEX_REGEX_REPEAT_MATCHER_HPP Copyright (c) 2011-2015 Regents of the University of California.
RegexRepeatMatcher(const std::string &expr, shared_ptr< RegexBackrefManager > backrefManager, size_t indicator)
const Component & get(ssize_t i) const
Get the component at the given index.
virtual void compile()
Compile the regular expression to generate the more matchers when necessary.
shared_ptr< RegexBackrefManager > m_backrefManager
std::vector< shared_ptr< RegexMatcher > > m_matchers
std::vector< name::Component > m_matchResult
Name abstraction to represent an absolute name.
virtual ~RegexRepeatMatcher()
virtual bool match(const Name &name, size_t offset, size_t len)