29 #include <boost/lexical_cast.hpp> 36 , m_isSecondaryUsed(false)
38 m_primaryBackrefManager = make_shared<RegexBackrefManager>();
39 m_secondaryBackrefManager = make_shared<RegexBackrefManager>();
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())
105 while (offset < expand.size()) {
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] ==
'\\') {
135 if (offset >= expand.size())
138 while (expand[offset] <=
'9' and expand[offset] >=
'0') {
140 if (offset > expand.size())
143 if (offset > begin + 1)
144 return expand.substr(begin, offset - begin);
148 else if (expand[offset] ==
'<') {
150 if (offset >= expand.size())
155 while (right < left) {
156 if (expand[offset] ==
'<')
158 if (expand[offset] ==
'>')
161 if (offset >= expand.size())
164 return expand.substr(begin, offset - begin);
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(
'\\');
static shared_ptr< RegexTopMatcher > fromName(const Name &name, bool hasAnchor=false)
Name & append(const Component &component)
Append a component.
void compile() override
Compile the regular expression to generate the more matchers when necessary.
std::vector< name::Component > m_matchResult
Represents an absolute name.
size_t size() const
Returns the number of components.
#define NDN_CXX_FALLTHROUGH
virtual Name expand(const std::string &expand="")
bool match(const Name &name)
RegexTopMatcher(const std::string &expr, const std::string &expand="")