#include <regex>
#include <string>
#include <iostream>
std::string remove_password(std::string const& input)
{
// I think this should work for skipping escaped quotes in the password.
// It works in javascript, but not in the standard library implementation.
// anyone have any ideas?
// (.*password\(("|'))(?:\\\2|[^\2])*?(\2.*)
// const char prog[] = R"__regex((.*password\(')([^']*)('.*)))__regex";
const char prog[] = R"((.*password\((["']))(?:\\\2|(?!\2)[^])*?(\2.*))";
auto reg = std::regex(prog, std::regex_constants::ECMAScript);
std::smatch match;
std::regex_match(input, match, reg);
// match[0] is the entire string
// match[1] is pre-password
// match[2] is the password
// match[3] is post-password
return match[1].str() + "********" + match[3].str();
}
int main()
{
using namespace std::literals;
auto test_string = R"__(select * from run_on_hive(server('hdp230m2.labs.teradata.com'),username('vijay'),password('vijay'),dbname('default'),query('analyze table default.test01 compute statistics'));)__";
std::cout << remove_password(test_string);
}
I2luY2x1ZGUgPHJlZ2V4PgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8aW9zdHJlYW0+CgpzdGQ6OnN0cmluZyByZW1vdmVfcGFzc3dvcmQoc3RkOjpzdHJpbmcgY29uc3QmIGlucHV0KQp7CiAgICAvLyBJIHRoaW5rIHRoaXMgc2hvdWxkIHdvcmsgZm9yIHNraXBwaW5nIGVzY2FwZWQgcXVvdGVzIGluIHRoZSBwYXNzd29yZC4KICAgIC8vIEl0IHdvcmtzIGluIGphdmFzY3JpcHQsIGJ1dCBub3QgaW4gdGhlIHN0YW5kYXJkIGxpYnJhcnkgaW1wbGVtZW50YXRpb24uCiAgICAvLyBhbnlvbmUgaGF2ZSBhbnkgaWRlYXM/CiAgICAvLyAoLipwYXNzd29yZFwoKCJ8JykpKD86XFxcMnxbXlwyXSkqPyhcMi4qKQovLyAgICBjb25zdCBjaGFyIHByb2dbXSA9IFIiX19yZWdleCgoLipwYXNzd29yZFwoJykoW14nXSopKCcuKikpKV9fcmVnZXgiOwogICAgY29uc3QgY2hhciBwcm9nW10gPSBSIigoLipwYXNzd29yZFwoKFsiJ10pKSg/OlxcXDJ8KD8hXDIpW15dKSo/KFwyLiopKSI7CiAgICBhdXRvIHJlZyA9IHN0ZDo6cmVnZXgocHJvZywgc3RkOjpyZWdleF9jb25zdGFudHM6OkVDTUFTY3JpcHQpOwogICAgc3RkOjpzbWF0Y2ggbWF0Y2g7CiAgICBzdGQ6OnJlZ2V4X21hdGNoKGlucHV0LCBtYXRjaCwgcmVnKTsKICAgIC8vIG1hdGNoWzBdIGlzIHRoZSBlbnRpcmUgc3RyaW5nCiAgICAvLyBtYXRjaFsxXSBpcyBwcmUtcGFzc3dvcmQKICAgIC8vIG1hdGNoWzJdIGlzIHRoZSBwYXNzd29yZAogICAgLy8gbWF0Y2hbM10gaXMgcG9zdC1wYXNzd29yZAogICAgcmV0dXJuIG1hdGNoWzFdLnN0cigpICsgIioqKioqKioqIiArIG1hdGNoWzNdLnN0cigpOwp9CgppbnQgbWFpbigpCnsKICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OmxpdGVyYWxzOwoKICAgIGF1dG8gdGVzdF9zdHJpbmcgPSBSIl9fKHNlbGVjdCAqIGZyb20gcnVuX29uX2hpdmUoc2VydmVyKCdoZHAyMzBtMi5sYWJzLnRlcmFkYXRhLmNvbScpLHVzZXJuYW1lKCd2aWpheScpLHBhc3N3b3JkKCd2aWpheScpLGRibmFtZSgnZGVmYXVsdCcpLHF1ZXJ5KCdhbmFseXplIHRhYmxlIGRlZmF1bHQudGVzdDAxIGNvbXB1dGUgc3RhdGlzdGljcycpKTspX18iOwoKICAgIHN0ZDo6Y291dCA8PCByZW1vdmVfcGFzc3dvcmQodGVzdF9zdHJpbmcpOwp9