gpt4 book ai didi

c++ - 在 cpp 中使用正则表达式将密码 ('abcs' ) 子句屏蔽为密码 ('****' )

转载 作者:太空宇宙 更新时间:2023-11-04 12:48:08 25 4
gpt4 key购买 nike

我有一个函数可以转换字符串:

 select * from run_on_hive(server('hdp230m2.labs.teradata.com'),username('vijay'),password('vijay'),dbname('default'),query('analyze table default.test01 compute statistics'));

到:

 select * from run_on_hive(server('hdp230m2.labs.teradata.com'),username('vijay'),'****',dbname('default'),query('analyze table default.test01 compute statistics'));

函数看起来像:

static SimpleRegexMask::Ptr newUDFMask(const String &udfName, const int paramPos)
{

return SimpleRegexMask::newInstance(
udfName,
udfName + "([^[:alpha:]]*)\\((([^,]*,){" + toString(paramPos - 1) + "})([^,]*)(,[^\\)]*)\\)",
udfName + "\\1\\(\\2'****'\\5\\)"
);
}

就是上面那个里面的函数。我希望它能解释我正在尝试做的事情

 static Ptr newInstance(
const String &baseRegex,
const String &replaceRegex,
const String &matchFormatString
)
{
return new SimpleRegexMask(baseRegex, replaceRegex, matchFormatString);
}


SimpleRegexMask::SimpleRegexMask(
const String &baseRegex,
const String &replaceRegex,
const String &matchFormatString
)
{
try {
basePattern_ = boost::regex(
baseRegex, boost::regex_constants::icase|boost::regex_constants::perl
);
replacePattern_ = boost::regex(
replaceRegex, boost::regex_constants::icase|boost::regex_constants::perl
);
matchFormatString_ = matchFormatString;
} catch (const boost::regex_error& ex) {
// programming error i.e. the regex supplied is not valid
NOT_REACHED;
}
}

但是,我想修改字符串为

 select * from run_on_hive(server('hdp230m2.labs.teradata.com'),username('vijay'),password('****'),dbname('default'),query('analyze table default.test01 compute statistics'));

我应该如何修改上面的函数来做到这一点?我哪里错了。请告诉我。TIA。

最佳答案

你可以使用

return SimpleRegexMask::newInstance(
udfName,
"(" + udfName + "[^[:alpha:]]*)\\(((?:[^,]*,){" + toString(paramPos - 1) + "}[^,(]*\\(['\"])[^,'\"]*(['\"]\\),[^)]*)\\)",
"\\1\\(\\2****\\3\\)"
);

参见 regex demo .

我在这里优化了捕获组的使用(减少了它们的数量)并使用了 [^,(]*\\(['\"])[^,'\"]*(['\"]\\) 模式以通过以下方式匹配 password 部分:将 password('password(" 捕获到第 2 组,然后只匹配除,, "' 以外的任何0+字符,然后捕获')") 进入后续的捕获组。

请注意,UDF 名称被捕获到第 1 组中,您不需要在替换字符串中对其进行硬编码。因此,如果它在字符串中是 RUN_ON_HIVE,即使您在模式中有 run_on_hive,结果中也会是 RUN_ON_HIVE(因为您是使用不区分大小写的修饰符)。

关于c++ - 在 cpp 中使用正则表达式将密码 ('abcs' ) 子句屏蔽为密码 ('****' ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50345834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com