如何使用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)
));
自从我使用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 ]+"));
遇到错误抱怨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
尝试更改boost :: regex(“etc。”)以boost :: regex
工作正常,谢谢!在这一点上,对我来说这一切看起来像是魔法般的,但它会给我一个开始理解迭代器和C++方式的更好的地方。 – 2010-07-08 18:22:51
@jjiffer:remove_copy_if接受一个输入范围(“s.begin(),s.end()”部分)和一个输出迭代器,它将提取的字符写入其中(“back_inserter(new_s)”部分)。第四个参数是一个函数对象,它将一个元素作为输入(在本例中为wchar_t)并返回bool。如果此函数返回true,则跳过该元素。 (待续...) – 2010-07-08 18:55:20
此函数对象在此使用boost :: bind创建。 “bind(&isalnum,_1,loc)”返回一个函数对象,该对象存储指向isalnum函数的指针和“loc”的副本。该函数对象在调用一个参数时将依次调用isalnum(the_argument,loc)并返回其结果。最后,运算符重载魔术允许我们将使用绑定创建的两个函数对象与OR运算符合并,并用NOT运算符否定其结果。 – 2010-07-08 18:57:41