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

时间:2018-05-15 08:41:24

标签: c++ regex

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

 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。

1 个答案:

答案 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(因为您使用的是不区分大小写的修饰符)。