boost::regex_replace自定义替换函数用法

关键字
boost 正则表达式 regex_replace 自定义替换函数

背景
vs2005/boost1.48.0

多层(Multilayer)分布式系统中,持久化层和业务逻辑层分别反映数据(数据库)的物理视图和逻辑视图。客户端和服务器的交互以业务语言为基础,
从而将物理层(后台数据库)的调整对上层业务以及客户端的影响降至最小。
客户端向服务器请求数据通常会带上一个高级过滤器(通俗地讲就是where条件)。高级过滤器区别于原始过滤器,原始过滤器就是SQL Where子句,可
直接拼接到SELECT语句中;高级过滤器则不同,高级过滤器中的字段使用的是逻辑模型中的字段,例如:
"单据编号='20021000' AND 发货地 like '%北京%'"。
“单据编号”、“发货地”、“进货价”是逻辑视图名称,不是真正的字段名。因此,服务器需要将高级过滤器中的逻辑字段名查找出来转换为物理字段名。替换后的结果为:"DJBH='20021000' AND FHD like '%北京%' "

解题思路
将高级过滤器中的逻辑字段名用正则表达式提取出来,然后根据逻辑字段名查找映射表找到真实字段名进行替换。使用正则表达式提取逻辑字段名,
使用regex_replace的自定义回调函数根据逻辑字段名查找映射表找到真实字段名。

示例代码如下。示例中分别给出了使用成员函数和非成员函数作为回调函数的几种用法。

// stringmatch.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <string>
#include <boost/regex.hpp>
#include <boost/bind.hpp>
#include <boost/function.hpp>
using namespace std;

string replace_callback(boost::match_results<std::string::const_iterator> match){
 if( match[0].str() == "单据编号" ){
  return "DJBH";
 }else  if( match[0].str() == "发货地" ){
  return "FHD";
 }else if( match[0].str() == "进货价" ){
  return "JHJ";
 }else{
  return match[0].str();
 }
}

class ClassA{
public:
 string replace_callback(boost::match_results<std::string::const_iterator> match){
  if( match[0].str() == "单据编号" ){
   return "DJBH";
  }else  if( match[0].str() == "发货地" ){
   return "FHD";
  }else if( match[0].str() == "进货价" ){
   return "JHJ";
  }else{
   return match[0].str();
  }
 }
};

int _tmain(int argc, _TCHAR* argv[])
{
 std::string s = "单据编号='20021000' AND 发货地 like '%123%' AND 进货价=单据编号";  
 boost::regex reg("([^ |\\=|<|>]+)",boost::regex::icase);///<该正则表达式提取以空格,<,>,=等风格的单词。若在单引号中出现的<,>,=和空格也会分割,显然不合题意。欢迎熟悉正则表达式的朋友给出完整的表达式

 string ret;

 ///<使用boost::function封装成员函数作为回调函数1
 ClassA a;
 boost::function<std::string (boost::match_results<std::string::const_iterator>)> function1 =    
  boost::bind(&ClassA::replace_callback, &a, _1);
 ret=boost::regex_replace(s,reg,function1); 
 std::cout<<ret<<endl;
 
 ///<使用成员函数作为回调函数2
 ret=boost::regex_replace(s,reg,std::bind1st(std::mem_fun(&ClassA::replace_callback), &a)); 
 std::cout<<ret<<endl;

 ///<使用boost::function封装普通函数作为回调函数1
 boost::function<std::string (boost::match_results<std::string::const_iterator>)> function2 =    
  boost::bind(&::replace_callback,_1);
 ret=boost::regex_replace(s,reg,function2); 
 std::cout<<ret<<endl;

 ///<直接使用普通函数作为回调函数2
 ret=boost::regex_replace(s,reg,replace_callback); 
 std::cout<<ret<<endl;

 return 0;
}


参考资料
http://stackoverflow.com/questions/4156559/boost-custom-formatter-using-boost-bind-to-method-taking-only-one-paramerter

 

### 使用 `regex_replace` 函数的概述 `regex_replace` 是一种强大的工具,用于基于正则表达式的字符串替换操作。它可以在多种编程环境中找到实现形式,比如 MySQL 和 C++ 的 Boost 库。 #### 在 MySQL 中使用 `REGEXP_REPLACE()` 函数 MySQL 提供了一个内置函数 `REGEXP_REPLACE()` 来执行基于正则表达式的字符串替换。该函数接受四个主要参数:输入字符串、正则表达式模式、替换字符串以及可选的位置偏移量[^1]。 以下是其基本语法: ```sql REGEXP_REPLACE(expr, pat, repl[, pos][, occurence][, match_type]) ``` - **expr**: 被搜索的目标字符串。 - **pat**: 正则表达式模式。 - **repl**: 替换后的字符串。 - **pos** (可选): 开始位置,默认为 1。 - **occurrence** (可选): 表示要替换第几次匹配项,默认为全部替换。 - **match_type** (可选): 控制匹配行为的标志位。 下面是一个简单的例子: ```sql SELECT REGEXP_REPLACE('abcABC', 'A[a-z]', '--') AS replaced; -- 输出: --bcABC ``` 上述语句会将第一个符合 `'A[a-z]'` 模式的子串替换成 `"--"`。 --- #### 在 C++ 中使用 `boost::regex_replace` 函数 Boost 库中的 `boost::regex_replace` 提供了灵活的方式来完成复杂的字符串替换任务。它可以接收多种形式的格式化器(Formatter),包括普通的字符串或者自定义回调函数[^3]。 ##### 基本语法 ```cpp template<class traits, class Formatter> basic_string<charT> regex_replace( const basic_string<charT>& s, const basic_regex<charT, traits>& e, Formatter fmt, boost::regex_constants::match_flag_type flags = boost::regex_constants::match_default); ``` - **s**: 输入源字符串。 - **e**: 定义匹配规则的正则表达式对象。 - **fmt**: 可以是目标替换字符串或者是返回新值的回调函数。 - **flags**: 配置选项,例如区分大小写等。 ##### 示例代码 以下展示如何利用固定字符串进行简单替换: ```cpp #include <iostream> #include <boost/regex.hpp> int main() { std::string text = "The price is $99."; boost::regex pattern("\\$\\d+"); // 将价格部分替换为 "[price]" std::string result = boost::regex_replace(text, pattern, "[price]"); std::cout << result << std::endl; // 输出: The price is [price]. } ``` 当需要更复杂的行为时,可以传递一个函数作为第三个参数来动态生成替换内容[^2]: ```cpp std::string replace_callback(const boost::smatch& m) { int value = std::stoi(m.str().substr(1)); // 移除美元符号并转换成整数 return "$" + std::to_string(value * 0.8); // 返回打折后的新价格 } // ... std::string discounted_price = boost::regex_replace(text, pattern, replace_callback); std::cout << discounted_price << std::endl; // 如果原价为 $99,则输出可能是 The price is $79. ``` 以上实例演示了通过调用外部方法来自定义每个匹配项的具体替代逻辑。 --- ### 总结说明 无论是数据库查询还是程序开发过程中遇到涉及文本处理的需求,掌握好相应平台下的 `regex_replace` 方法都是非常有益处的一项技能。它们允许开发者精确指定哪些数据应该被修改,并且能够自动化这一过程从而节省大量时间精力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值