pastebin - collaborative debugging tool
nrubsig.kpaste.net RSS


cppregexurlparser1.cpp - regex URL parser
Posted by Anonymous on Wed 24th Jan 2024 09:33
raw | new post

  1. /*
  2.  * MIT License
  3.  *
  4.  * Copyright (c) 2024 Roland Mainz <roland.mainz@nrubsig.org>
  5.  *
  6.  * Permission is hereby granted, free of charge, to any person obtaining a copy
  7.  * of this software and associated documentation files (the "Software"), to deal
  8.  * in the Software without restriction, including without limitation the rights
  9.  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10.  * copies of the Software, and to permit persons to whom the Software is
  11.  * furnished to do so, subject to the following conditions:
  12.  *
  13.  * The above copyright notice and this permission notice shall be included in all
  14.  * copies or substantial portions of the Software.
  15.  *
  16.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19.  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21.  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  22.  * SOFTWARE.
  23.  */
  24.  
  25. /*
  26.  * cppregexurlparser1.cpp - regex URL parer
  27.  */
  28. #include <regex>
  29. #include <iostream>
  30. #include <stdlib.h>
  31.  
  32. int main(int ac, char *av[])
  33. {
  34.   std::string Input {"myurl://foo:80/bar"};
  35.   /*
  36.    * MSVC:
  37.    * be aware of https://stackoverflow.com/questions/39645660/stdregex-to-match-begin-end-of-string
  38.    */
  39.   std::regex Pattern {
  40.                 "^"
  41.                 "(.+?)"                         // scheme
  42.                 "://"                           // '://'
  43.                 "("                             // login
  44.                         "(?:"
  45.                                 "(.+?)"         // user (optional)
  46.                                 "(?::(.+))?"    // password (optional)
  47.                                 "@"
  48.                         ")?"
  49.                         "("                     // hostport
  50.                                 "(.+?)"         // host
  51.                                 "(?::([[:digit:]]+))?" // port (optional)
  52.                         ")"
  53.                 ")"
  54.                 "(?:/(.*?))?"                   // path (optional)  
  55.                 "$",
  56.         std::regex_constants::ECMAScript };
  57.   std::smatch Matches;
  58.  
  59.   if (std::regex_search(Input, Matches,
  60.                         Pattern)) {
  61.     std::cout << Matches.size()
  62.               << " submatches found!";
  63.     for (size_t i{0}; i < Matches.size(); ++i) {
  64.       std::cout << "\n\nSubmatch " << i << ": "
  65.                 << Matches[i] << "\n  Length: "
  66.                 << Matches[i].length()
  67.                 << "\n  First Character: "
  68.                 << *Matches[i].first
  69.                 << "\n  Position: "
  70.                 << Matches.position(i) << std::endl;
  71.     }
  72.   }
  73.   return EXIT_SUCCESS;
  74. }

Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.

Syntax highlighting:

To highlight particular lines, prefix each line with {%HIGHLIGHT}




All content is user-submitted.
The administrators of this site (kpaste.net) are not responsible for their content.
Abuse reports should be emailed to us at