我有一个转换字符串的函数:
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。
答案 0 :(得分:0)
您可以使用
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
(因为您使用的是不区分大小写的修饰符)。