00001
00002
00003
00004
00005
00006
00007
00008 #ifndef BOOSTER_REGEX_MATCH_H
00009 #define BOOSTER_REGEX_MATCH_H
00010
00011 #include <algorithm>
00012 #include <iterator>
00013 #include <string>
00014 #include <vector>
00015 #include <string.h>
00016
00017 namespace booster {
00018
00024 template<typename Iterator>
00025 class sub_match : public std::pair<Iterator,Iterator> {
00026 public:
00027 typedef Iterator iterator;
00028 typedef typename std::iterator_traits<Iterator>::value_type value_type;
00029 typedef typename std::iterator_traits<Iterator>::difference_type difference_type;
00030
00034 typedef std::basic_string<value_type> string_type;
00035 typedef std::pair<Iterator,Iterator> pair_type;
00036
00041 bool matched;
00042
00046 difference_type length() const
00047 {
00048 if(matched)
00049 return std::distance(pair_type::first,pair_type::second);
00050 return 0;
00051 }
00052
00056 operator string_type() const
00057 {
00058 return str();
00059 }
00060
00064 string_type str() const
00065 {
00066 if(matched)
00067 return string_type(pair_type::first,pair_type::second);
00068 else
00069 return string_type();
00070
00071 }
00075 int compare(sub_match const &other) const
00076 {
00077 return str().compare(other.str());
00078 }
00082 int compare(string_type const &other) const
00083 {
00084 return str().compare(other);
00085 }
00089 int compare(value_type const *s) const
00090 {
00091 return str().compare(s);
00092 }
00096 sub_match() : matched(false)
00097 {
00098 }
00099 };
00100
00101 typedef sub_match<char const *> csub_match;
00102 typedef sub_match<std::string::const_iterator> ssub_match;
00103
00104
00109 template<typename Iterator>
00110 class match_results {
00111 public:
00115 match_results()
00116 {
00117 begin_ = Iterator();
00118 end_ = Iterator();
00119 }
00123 typedef sub_match<Iterator> value_type;
00124
00128 value_type operator[](int n) const
00129 {
00130 value_type r;
00131 if(n < 0 || n >= int(offsets_.size()))
00132 return r;
00133 if(offsets_[n].first == -1)
00134 return r;
00135 r.matched = true;
00136 r.first = begin_;
00137 r.second = begin_;
00138 std::advance(r.first,offsets_[n].first);
00139 std::advance(r.second,offsets_[n].second);
00140 return r;
00141 }
00142
00146 size_t size() const
00147 {
00148 return offsets_.size();
00149 }
00150
00154 value_type suffix()
00155 {
00156 value_type r;
00157 if(offsets_.empty())
00158 return r;
00159 r.first = begin_;
00160 r.second = end_;
00161 std::advance(r.first,offsets_.back().second);
00162 r.matched = r.first != r.second;
00163 return r;
00164 }
00165
00169 value_type prefix()
00170 {
00171 value_type r;
00172 if(offsets_.empty() || offsets_[0].first == 0)
00173 return r;
00174 r.matched = true;
00175 r.first = begin_;
00176 r.second = begin_;
00177 std::advance(r.second,offsets_[0].first);
00178 return r;
00179 }
00180
00182
00183 void assign(Iterator begin,Iterator end,std::vector<std::pair<int,int> > &offsets)
00184 {
00185 begin_ = begin;
00186 end_ = end;
00187 offsets_.swap(offsets);
00188 }
00189
00191
00192 private:
00193 Iterator begin_,end_;
00194 std::vector<std::pair<int,int> > offsets_;
00195 };
00196
00197 typedef match_results<char const *> cmatch;
00198 typedef match_results<std::string::const_iterator> smatch;
00199
00204 template<typename Regex>
00205 bool regex_match(char const *begin,char const *end,cmatch &m, Regex const &r,int flags = 0)
00206 {
00207 std::vector<std::pair<int,int> > map;
00208 bool res = r.match(begin,end,map,flags);
00209 if(!res) return false;
00210 m.assign(begin,end,map);
00211 return true;
00212 }
00217
00218 template<typename Regex>
00219 bool regex_match(std::string const &s,smatch &m, Regex const &r,int flags = 0)
00220 {
00221 std::vector<std::pair<int,int> > map;
00222 bool res = r.match(s.c_str(),s.c_str()+s.size(),map,flags);
00223 if(!res) return false;
00224 m.assign(s.begin(),s.end(),map);
00225 return true;
00226 }
00231
00232 template<typename Regex>
00233 bool regex_match(char const *s,cmatch &m, Regex const &r,int flags = 0)
00234 {
00235 std::vector<std::pair<int,int> > map;
00236 char const *begin=s;
00237 char const *end = begin+strlen(begin);
00238 bool res = r.match(begin,end,map,flags);
00239 if(!res) return false;
00240 m.assign(begin,end,map);
00241 return true;
00242 }
00243
00248 template<typename Regex>
00249 bool regex_search(char const *begin,char const *end,cmatch &m, Regex const &r,int flags = 0)
00250 {
00251 std::vector<std::pair<int,int> > map;
00252 bool res = r.search(begin,end,map,flags);
00253 if(!res) return false;
00254 m.assign(begin,end,map);
00255 return true;
00256 }
00257
00262 template<typename Regex>
00263 bool regex_search(std::string const &s,smatch &m, Regex const &r,int flags = 0)
00264 {
00265 std::vector<std::pair<int,int> > map;
00266 bool res = r.search(s.c_str(),s.c_str()+s.size(),map,flags);
00267 if(!res) return false;
00268 m.assign(s.begin(),s.end(),map);
00269 return true;
00270 }
00271
00276
00277 template<typename Regex>
00278 bool regex_search(char const *s,cmatch &m, Regex const &r,int flags = 0)
00279 {
00280 std::vector<std::pair<int,int> > map;
00281 char const *begin=s;
00282 char const *end = begin+strlen(begin);
00283 bool res = r.search(begin,end,map,flags);
00284 if(!res) return false;
00285 m.assign(begin,end,map);
00286 return true;
00287 }
00288
00292 template<typename Regex>
00293 bool regex_match(char const *begin,char const *end, Regex const &r,int flags = 0)
00294 {
00295 return r.match(begin,end,flags);
00296 }
00300
00301 template<typename Regex>
00302 bool regex_match(std::string const &s, Regex const &r,int flags = 0)
00303 {
00304 return r.match(s.c_str(),s.c_str()+s.size(),flags);
00305 }
00309
00310 template<typename Regex>
00311 bool regex_match(char const *s, Regex const &r,int flags = 0)
00312 {
00313 return r.match(s,s+strlen(s),flags);
00314 }
00315
00319 template<typename Regex>
00320 bool regex_search(char const *begin,char const *end, Regex const &r,int flags = 0)
00321 {
00322 return r.search(begin,end,flags);
00323 }
00324
00328 template<typename Regex>
00329 bool regex_search(std::string const &s, Regex const &r,int flags = 0)
00330 {
00331 return r.search(s.c_str(),s.c_str()+s.size(),flags);
00332 }
00333
00337 template<typename Regex>
00338 bool regex_search(char const *s, Regex const &r,int flags = 0)
00339 {
00340 return r.search(s,s+strlen(s),flags);
00341 }
00342
00343
00344
00345 template<typename Iterator>
00346 bool operator==(sub_match<Iterator> const &l,sub_match<Iterator> const &r) { return l.compare(r) == 0; }
00347 template<typename Iterator>
00348 bool operator!=(sub_match<Iterator> const &l,sub_match<Iterator> const &r) { return l.compare(r) != 0; }
00349 template<typename Iterator>
00350 bool operator< (sub_match<Iterator> const &l,sub_match<Iterator> const &r) { return l.compare(r) < 0; }
00351 template<typename Iterator>
00352 bool operator> (sub_match<Iterator> const &l,sub_match<Iterator> const &r) { return l.compare(r) > 0; }
00353 template<typename Iterator>
00354 bool operator<=(sub_match<Iterator> const &l,sub_match<Iterator> const &r) { return l.compare(r) <= 0; }
00355 template<typename Iterator>
00356 bool operator>=(sub_match<Iterator> const &l,sub_match<Iterator> const &r) { return l.compare(r) >= 0; }
00357
00358
00359 template<typename Iterator>
00360 bool operator==(
00361 typename sub_match<Iterator>::string_type const &l,
00362 sub_match<Iterator> const &r)
00363 { return l.compare(r) == 0; }
00364 template<typename Iterator>
00365 bool operator!=(
00366 typename sub_match<Iterator>::string_type const &l,
00367 sub_match<Iterator> const &r)
00368 { return l.compare(r) != 0; }
00369
00370 template<typename Iterator>
00371 bool operator<=(
00372 typename sub_match<Iterator>::string_type const &l,
00373 sub_match<Iterator> const &r)
00374 { return l.compare(r) <= 0; }
00375 template<typename Iterator>
00376 bool operator>=(
00377 typename sub_match<Iterator>::string_type const &l,
00378 sub_match<Iterator> const &r)
00379 { return l.compare(r) >= 0; }
00380
00381 template<typename Iterator>
00382 bool operator<(
00383 typename sub_match<Iterator>::string_type const &l,
00384 sub_match<Iterator> const &r)
00385 { return l.compare(r) <0; }
00386 template<typename Iterator>
00387 bool operator>(
00388 typename sub_match<Iterator>::string_type const &l,
00389 sub_match<Iterator> const &r)
00390 { return l.compare(r) > 0; }
00391
00392
00393
00394 template<typename Iterator>
00395 bool operator==(
00396 sub_match<Iterator> const &l,
00397 typename sub_match<Iterator>::string_type const &r
00398 )
00399 { return l.compare(r) == 0; }
00400 template<typename Iterator>
00401 bool operator!=(
00402 sub_match<Iterator> const &l,
00403 typename sub_match<Iterator>::string_type const &r
00404 )
00405 { return l.compare(r) != 0; }
00406
00407 template<typename Iterator>
00408 bool operator<=(
00409 sub_match<Iterator> const &l,
00410 typename sub_match<Iterator>::string_type const &r
00411 )
00412 { return l.compare(r) <= 0; }
00413
00414 template<typename Iterator>
00415 bool operator>=(
00416 sub_match<Iterator> const &l,
00417 typename sub_match<Iterator>::string_type const &r
00418 )
00419 { return l.compare(r) >= 0; }
00420
00421 template<typename Iterator>
00422 bool operator<(
00423 sub_match<Iterator> const &l,
00424 typename sub_match<Iterator>::string_type const &r
00425 )
00426 { return l.compare(r) <0; }
00427
00428 template<typename Iterator>
00429 bool operator>(
00430 sub_match<Iterator> const &l,
00431 typename sub_match<Iterator>::string_type const &r
00432 )
00433 { return l.compare(r) > 0; }
00434
00435
00436 template<typename Iterator>
00437 bool operator==(
00438 typename std::iterator_traits<Iterator>::value_type const *l,
00439 sub_match<Iterator> const &r)
00440 { return r.compare(l) ==0; }
00441 template<typename Iterator>
00442 bool operator!=(
00443 typename std::iterator_traits<Iterator>::value_type const *l,
00444 sub_match<Iterator> const &r)
00445 { return r.compare(l) !=0; }
00446
00447
00448 template<typename Iterator>
00449 bool operator<=(
00450 typename std::iterator_traits<Iterator>::value_type const *l,
00451 sub_match<Iterator> const &r)
00452 { return r.compare(l) > 0; }
00453 template<typename Iterator>
00454 bool operator>=(
00455 typename std::iterator_traits<Iterator>::value_type const *l,
00456 sub_match<Iterator> const &r)
00457 { return r.compare(l) < 0; }
00458
00459 template<typename Iterator>
00460 bool operator<(
00461 typename std::iterator_traits<Iterator>::value_type const *l,
00462 sub_match<Iterator> const &r)
00463 { return r.compare(l) >=0; }
00464 template<typename Iterator>
00465 bool operator>(
00466 typename std::iterator_traits<Iterator>::value_type const *l,
00467 sub_match<Iterator> const &r)
00468 { return r.compare(l) <= 0; }
00469
00470
00471
00472
00473 template<typename Iterator>
00474 bool operator==(
00475 sub_match<Iterator> const &l,
00476 typename std::iterator_traits<Iterator>::value_type const *r
00477 )
00478 { return l.compare(r) == 0; }
00479 template<typename Iterator>
00480 bool operator!=(
00481 sub_match<Iterator> const &l,
00482 typename std::iterator_traits<Iterator>::value_type const *r
00483 )
00484 { return l.compare(r) != 0; }
00485
00486 template<typename Iterator>
00487 bool operator<=(
00488 sub_match<Iterator> const &l,
00489 typename std::iterator_traits<Iterator>::value_type const *r
00490 )
00491 { return l.compare(r) <= 0; }
00492
00493 template<typename Iterator>
00494 bool operator>=(
00495 sub_match<Iterator> const &l,
00496 typename std::iterator_traits<Iterator>::value_type const *r
00497 )
00498 { return l.compare(r) >= 0; }
00499
00500 template<typename Iterator>
00501 bool operator<(
00502 sub_match<Iterator> const &l,
00503 typename std::iterator_traits<Iterator>::value_type const *r
00504 )
00505 { return l.compare(r) <0; }
00506
00507 template<typename Iterator>
00508 bool operator>(
00509 sub_match<Iterator> const &l,
00510 typename std::iterator_traits<Iterator>::value_type const *r
00511 )
00512 { return l.compare(r) > 0; }
00513
00514
00515
00516 template<typename Iterator>
00517 typename sub_match<Iterator>::string_type
00518 operator+(sub_match<Iterator> const &l,sub_match<Iterator> const &r)
00519 { return l.str() + r.str(); }
00520
00521 template<typename Iterator>
00522 typename sub_match<Iterator>::string_type
00523 operator+(sub_match<Iterator> const &l,typename sub_match<Iterator>::string_type const &r)
00524 { return l.str() + r; }
00525
00526 template<typename Iterator>
00527 typename sub_match<Iterator>::string_type
00528 operator+(typename sub_match<Iterator>::string_type const &l,sub_match<Iterator> const &r)
00529 { return l + r.str(); }
00530
00531 template<typename Iterator>
00532 typename sub_match<Iterator>::string_type
00533 operator+(sub_match<Iterator> const &l,typename sub_match<Iterator>::value_type const *r)
00534 { return l.str() + r; }
00535
00536 template<typename Iterator>
00537 typename sub_match<Iterator>::string_type
00538 operator+(typename sub_match<Iterator>::value_type const *l,sub_match<Iterator> const &r)
00539 { return l + r.str(); }
00540
00541 }
00542
00543
00544
00545 #endif