c++ - Regex to match either one of two filename patterns -
i trying match filenames using boost::regex , have 2 kinds of patters:
xyzsomestringxysomestringending
the string somestring can (>0 characters). beginning of filename either xyz or xy. if xy , there has string ending terminates whole sequence. tried combine 2 regex | doesnt work. matches filenames first pattern:
(xyz)(.*) and matches filenames second pattern:
(xy)(.*)(ending) but when combine them, first pattern matches:
((xyz)(.*))|((xy)(.*)(ending)) all supposed case insensitive, why use boost::regex::icase in constructor. have tried without icase, doesnt work either).
any suggestions?
there may simpler expressions think regex ^xy(?(?!z).*ending$|.*$) should it:
#include <iostream> #include <string> #include <boost/regex.hpp> bool bmatch(const std::string& x, const std::string& re_) { const boost::regex re(re_, boost::regex::icase); boost::smatch what; return boost::regex_match(x, what, re); } int main() { std::string re = "^xy(?(?!z).*ending$|.*$)"; std::vector<std::string> vx = { "xyz124f5sf", "xyz12345", "xy38fsj dfending", "xy4 dfhd ending", "xyz", "xy345kendi", "xy56nding" }; (auto : vx) { std::cout << "\nstring '" << i; if (bmatch(i, re)) { std::cout << "' matched." << std::endl; } else { std::cout << "' not matched." << std::endl; } } return 0; } here's live demo.
edit: additionally, think regex ^xy(z.*|.*ending)$ should work well.
Comments
Post a Comment