如何使用C++/Boost过滤字符串中的字符

问题描述:

这似乎是这样一个基本问题,所以如果它已经在某个地方得到了回答(我的搜索没有发现任何内容),我表示歉意。如何使用C++/Boost过滤字符串中的字符

我只想过滤一个字符串对象,以便它只包含字母数字和空格字符。

这里是我的尝试:

#include "boost/algorithm/string/erase.hpp" 
#include "boost/algorithm/string/classification.hpp" 

std::wstring oldStr = "Bla=bla =&*\nSampleSampleSample "; 
std::wstring newStr = boost::erase_all_copy(oldStr, !(boost::is_alnum() || 
                 boost::is_space())); 

但是,编译器不符合,在所有快乐 - 看来我只能把一个字符串中的erase_all_copy第二个参数,而不是这个is_alnum()东西。

是否有一些明显的解决方案我在这里失踪?

随着性病的算法和Boost.Bind:

std::wstring s = ... 
std::wstring new_s; 
std::locale loc; 
std::remove_copy_if(s.begin(), s.end(), std::back_inserter(new_s), 
    !(boost::bind(&std::isalnum<wchar_t>, _1, loc)|| 
     boost::bind(&std::isspace<wchar_t>, _1, loc) 
)); 
+0

工作正常,谢谢!在这一点上,对我来说这一切看起来像是魔法般的,但它会给我一个开始理解迭代器和C++方式的更好的地方。 – 2010-07-08 18:22:51

+0

@jjiffer:remove_copy_if接受一个输入范围(“s.begin(),s.end()”部分)和一个输出迭代器,它将提取的字符写入其中(“back_inserter(new_s)”部分)。第四个参数是一个函数对象,它将一个元素作为输入(在本例中为wchar_t)并返回bool。如果此函数返回true,则跳过该元素。 (待续...) – 2010-07-08 18:55:20

+0

此函数对象在此使用boost :: bind创建。 “bind(&isalnum,_1,loc)”返回一个函数对象,该对象存储指向isalnum函数的指针和“loc”的副本。该函数对象在调用一个参数时将依次调用isalnum(the_argument,loc)并返回其结果。最后,运算符重载魔术允许我们将使用绑定创建的两个函数对象与OR运算符合并,并用NOT运算符否定其结果。 – 2010-07-08 18:57:41

自从我使用boost以来已经有多年了,但也许您可以使用erase_all_regex_copy()而不是erase_all_copy()?这可能是一个性能问题,但它可能是您迭代每个元素并手动检查的唯一选择。如果你不熟悉正则表达式,那么在这种情况下使用的表达式就像“[^ a-zA-Z0-9] +”。

为了完整起见,一些示例代码:

#include "boost/regex.hpp" 
#include "boost/algorithm/string/regex.hpp" 

std::wstring oldStr = "Bla=bla =&*\nSampleSampleSample "; 
std::wstring newStr = boost::erase_all_regex_copy(oldStr, boost::regex("[^a-zA-Z0-9 ]+")); 
+0

遇到错误抱怨char_t和wchar_t的转换。也许这个正则表达式隐含地假定char_t而不是wchar_t?我在正则表达式字符串前面放了一个L,但它也不喜欢那个。 长长错误消息的开始: C:\ boost_1_40_0 \ boost/regex/v4/perl_matcher_common.hpp(802):warning C4244:'argument':从'const wchar_t'转换为'char',可能会丢失的数据 – 2010-07-08 18:07:09

+0

尝试更改boost :: regex(“etc。”)以boost :: regex (“etc.”),也许?再一次,埃里克在那里有一个很好的解决方案,可能不会给你同样的麻烦。 :)(另外,我会自己测试这段代码,但是我的开发机器上没有安装boost ...现在编译/安装它。) – Faisal 2010-07-08 18:16:42