如何修改C++正则掩码函数,保留password()结构替换密码内容?
问题分析与解决方案
问题根源
你当前的正则表达式犯了一个关键错误:它把**整个第3个参数(包括password('vijay')的完整结构)**捕获成了一个单独的分组,然后直接用'****'替换这个分组,导致password(和)这部分结构被丢失了。
具体看原正则:
udfName + "([^[:alpha:]]*)\((([^,]*,){" + toString(paramPos - 1) + "})([^,]*)(,[^\)]*)\)"
其中的([^,]*)分组会匹配从第3个参数开头到下一个逗号的所有内容——也就是password('vijay'),替换时直接用'****'覆盖这个分组,自然就把外层的password(和)给去掉了。
修改后的函数实现
要保留password('****')的结构,我们需要调整正则,让它精准匹配password('xxx')里的引号内容,只替换密码部分,保留外层结构。修改后的代码如下:
static SimpleRegexMask::Ptr newUDFMask(const String &udfName, const int paramPos) { return SimpleRegexMask::newInstance( udfName, // 调整正则:精准匹配第paramPos个参数中的password('...')结构 udfName + R"([^[:alpha:]]*\((([^,]*,){)" + toString(paramPos - 1) + R"(password\(')([^']*)(')(,[^\)]*)\))", // 替换逻辑:保留password('和'),仅替换引号内的密码为**** udfName + R"(\1(\2'****'\4\5))" ); }
关键修改说明
- 正则分组拆解:
([^,]*,){paramPos-1}:匹配前paramPos-1个完整参数(比如你的场景中是server('hdp230m2.labs.teradata.com'),username('vijay'),)password\(':精准匹配第3个参数的开头标识password('([^']*):专门捕获引号内的密码明文(vijay)':匹配密码后的闭合引号(,[^\)]*):匹配括号内剩余的所有参数内容
- 替换字符串对应调整:
\1(\2'****'\4\5):把捕获的前序参数、password('、闭合引号'、剩余参数都保留下来,只把原来的密码明文替换成****
这样处理后,你的原SQL就会被正确转换为:
select * from run_on_hive(server('hdp230m2.labs.teradata.com'),username('vijay'),password('****'),dbname('default'),query('analyze table default.test01 compute statistics'));
内容的提问来源于stack exchange,提问作者hydra123
相关产品推荐
相关产品推荐

