29 #include <boost/lexical_cast.hpp>
36 , m_isSecondaryUsed(false)
38 m_primaryBackrefManager = make_shared<RegexBackrefManager>();
39 m_secondaryBackrefManager = make_shared<RegexBackrefManager>();
44 RegexTopMatcher::compile()
48 if (
'$' != expr[expr.size() - 1])
49 expr = expr +
"<.*>*";
51 expr = expr.substr(0, expr.size() - 1);
54 m_secondaryMatcher = make_shared<RegexPatternListMatcher>(
"<.*>*" + expr,
55 m_secondaryBackrefManager);
58 expr = expr.substr(1, expr.size() - 1);
61 m_primaryMatcher = make_shared<RegexPatternListMatcher>(expr, m_primaryBackrefManager);
67 m_isSecondaryUsed =
false;
71 if (m_primaryMatcher->match(name, 0, name.
size())) {
76 if (m_secondaryMatcher !=
nullptr && m_secondaryMatcher->match(name, 0, name.
size())) {
78 m_isSecondaryUsed =
true;
94 auto backrefManager = m_isSecondaryUsed ? m_secondaryBackrefManager : m_primaryBackrefManager;
95 size_t backrefNo = backrefManager->size();
98 if (!expandStr.empty())
106 std::string item = getItemFromExpand(
expand, offset);
107 if (item[0] ==
'<') {
108 result.
append(item.substr(1, item.size() - 2));
110 if (item[0] ==
'\\') {
111 size_t index = boost::lexical_cast<size_t>(item.substr(1, item.size() - 1));
116 else if (index <= backrefNo) {
117 for (
const auto& i : backrefManager->getBackref(index - 1)->getMatchResult())
129 RegexTopMatcher::getItemFromExpand(
const std::string& expand,
size_t& offset)
131 size_t begin = offset;
133 if (
expand[offset] ==
'\\') {
136 NDN_THROW(Error(
"Wrong format of expand string"));
138 while (
expand[offset] <=
'9' and
expand[offset] >=
'0') {
141 NDN_THROW(Error(
"Wrong format of expand string"));
143 if (offset > begin + 1)
144 return expand.substr(begin, offset - begin);
146 NDN_THROW(Error(
"Wrong format of expand string"));
148 else if (
expand[offset] ==
'<') {
151 NDN_THROW(Error(
"Wrong format of expand string"));
155 while (right < left) {
156 if (
expand[offset] ==
'<')
158 if (
expand[offset] ==
'>')
162 NDN_THROW(Error(
"Wrong format of expand string"));
164 return expand.substr(begin, offset - begin);
167 NDN_THROW(Error(
"Wrong format of expand string"));
170 shared_ptr<RegexTopMatcher>
173 std::string regexStr(
"^");
175 for (
const auto& i : name) {
176 regexStr.append(
"<");
177 regexStr.append(convertSpecialChar(i.toUri()));
178 regexStr.append(
">");
182 regexStr.append(
"$");
184 return make_shared<RegexTopMatcher>(regexStr);
188 RegexTopMatcher::convertSpecialChar(
const std::string& str)
192 for (
size_t i = 0; i < str.size(); i++) {
208 newStr.push_back(
'\\');
#define NDN_CXX_FALLTHROUGH
Represents an absolute name.
size_t size() const noexcept
Returns the number of components.
Name & append(const Component &component)
Append a name component.
std::vector< name::Component > m_matchResult
static shared_ptr< RegexTopMatcher > fromName(const Name &name, bool hasAnchor=false)
bool match(const Name &name)
virtual Name expand(const std::string &expand="")
RegexTopMatcher(const std::string &expr, const std::string &expand="")