mirror of
https://github.com/bingmann/2018-cpp-spirit-parsing.git
synced 2025-12-18 13:14:37 +03:00
Seven instructive examples how to use Boost Spirit
This commit is contained in:
128
regex.cpp
Normal file
128
regex.cpp
Normal file
@@ -0,0 +1,128 @@
|
||||
// Example how to use C++11 <regex> and Boost.Regex
|
||||
|
||||
#include <iostream>
|
||||
|
||||
/******************************************************************************/
|
||||
// use std::regex to find a date in a string
|
||||
|
||||
#include <regex>
|
||||
|
||||
void std_regex() {
|
||||
std::string str = "C++ Meetup on 2018-09-12 about String Parsing";
|
||||
|
||||
// simple regex match: "on ####-##-##"
|
||||
std::regex re1("on ([0-9]{4}-[0-9]{2}-[0-9]{2})");
|
||||
|
||||
if (std::regex_search(str, re1)) {
|
||||
std::cout << "std::regex_search() with re1: matched!" << std::endl;
|
||||
}
|
||||
else {
|
||||
std::cout << "std::regex_search() with re1: no match!" << std::endl;
|
||||
}
|
||||
|
||||
if (std::regex_match(str, re1)) {
|
||||
std::cout << "std::regex_match() with re1: matched!" << std::endl;
|
||||
}
|
||||
else {
|
||||
std::cout << "std::regex_match() with re1: no match!" << std::endl;
|
||||
}
|
||||
|
||||
// regex match and std::string captures
|
||||
std::smatch match;
|
||||
|
||||
if (std::regex_search(str, match, re1)) {
|
||||
std::cout << "std::regex_search() with re1: matched!" << std::endl
|
||||
<< " match.size() = " << match.size() << std::endl
|
||||
<< " match[0] = " << match[0] << std::endl
|
||||
<< " match[1] = " << match[1] << std::endl;
|
||||
}
|
||||
else {
|
||||
std::cout << "std::regex_search() with re1: no match!" << std::endl;
|
||||
}
|
||||
|
||||
// Also: std::cmatch for const char* captures
|
||||
const char* cstr = "Hello on 2018-09-13";
|
||||
std::cmatch cmatch;
|
||||
|
||||
if (std::regex_search(cstr, cmatch, re1)) {
|
||||
std::cout << "std::regex_search() with re1: matched!" << std::endl
|
||||
<< " match.size() = " << cmatch.size() << std::endl
|
||||
<< " match[0] = " << cmatch[0] << std::endl
|
||||
<< " match[1] = " << cmatch[1] << std::endl;
|
||||
}
|
||||
else {
|
||||
std::cout << "std::regex_search() with re1: no match!" << std::endl;
|
||||
}
|
||||
|
||||
// use regex_replace and construct a new string
|
||||
std::string result = std::regex_replace(str, re1, "TODAY");
|
||||
std::cout << "std::regex_replace() result = " << result << std::endl;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
// alternative: use Boost.Regex
|
||||
|
||||
#include <boost/regex.hpp>
|
||||
|
||||
void boost_regex() {
|
||||
std::string str = "C++ Meetup on 2018-09-12 about String Parsing";
|
||||
|
||||
// simple regex match
|
||||
boost::regex re1("on ([0-9]{4}-[0-9]{2}-[0-9]{2})");
|
||||
|
||||
if (boost::regex_search(str, re1)) {
|
||||
std::cout << "boost::regex_search() with re1: matched!" << std::endl;
|
||||
}
|
||||
else {
|
||||
std::cout << "boost::regex_search() with re1: no match!" << std::endl;
|
||||
}
|
||||
|
||||
if (boost::regex_match(str, re1)) {
|
||||
std::cout << "boost::regex_match() with re1: matched!" << std::endl;
|
||||
}
|
||||
else {
|
||||
std::cout << "boost::regex_match() with re1: no match!" << std::endl;
|
||||
}
|
||||
|
||||
// regex match and std::string captures
|
||||
boost::smatch match;
|
||||
|
||||
if (boost::regex_search(str, match, re1)) {
|
||||
std::cout << "boost::regex_search() with re1: matched!" << std::endl
|
||||
<< " match.size() = " << match.size() << std::endl
|
||||
<< " match[0] = " << match[0] << std::endl
|
||||
<< " match[1] = " << match[1] << std::endl;
|
||||
}
|
||||
else {
|
||||
std::cout << "boost::regex_search() with re1: no match!" << std::endl;
|
||||
}
|
||||
|
||||
// also: boost::cmatch for const char* captures, and regex_replace.
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
// Note: I usually make a "compatibility" include which defines
|
||||
|
||||
#if (__cplusplus >= 201103L)
|
||||
|
||||
using std::regex_search;
|
||||
// ... and other symbols
|
||||
|
||||
#else
|
||||
|
||||
// or import from Boost
|
||||
using boost::regex_search;
|
||||
|
||||
#endif
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
int main()
|
||||
{
|
||||
std_regex();
|
||||
boost_regex();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
Reference in New Issue
Block a user