我正在编写一个函数来确定字符串是否只包含字母数字字符和空格。我正在有效地测试它是否与正则表达式^[[:alnum:] ]+$
匹配但不使用正则表达式。这就是我到目前为止所做的:
#include <algorithm>
static inline bool is_not_alnum_space(char c)
{
return !(isalpha(c) || isdigit(c) || (c == ' '));
}
bool string_is_valid(const std::string &str)
{
return find_if(str.begin(), str.end(), is_not_alnum_space) == str.end();
}
是否有更好的解决方案或“更多C ++”方式来实现这一目标?
答案 0 :(得分:26)
对我来说很好,但您可以使用isalnum(c)
代替isalpha
和isdigit
。
答案 1 :(得分:9)
期待C ++ 0x,你将能够使用lambda函数(你可以用gcc 4.5或VS2010来试试):
bool string_is_valid(const std::string &str)
{
return find_if(str.begin(), str.end(),
[](char c) { return !(isalnum(c) || (c == ' ')); }) == str.end();
}
答案 2 :(得分:2)
您也可以使用活页夹执行此操作,以便删除帮助程序功能。我建议使用Boost Binders,因为它们比标准库绑定器更容易使用:
bool string_is_valid(const std::string &str)
{
return find_if(str.begin(), str.end(),
!boost::bind(isalnum, _1) || boost::bind(std::not_equal_to<char>, _1, ' ')) == str.end();
}
答案 3 :(得分:1)
小点,但是如果你想让is_not_alnum_space()成为一个只在那个特定编译单元中可见的辅助函数,你应该把它放在一个匿名的命名空间而不是静态:
namespace {
bool is_not_alnum_space(char c)
{
return !(isalpha(c) || isdigit(c) || (c == ' '));
}
}
...etc