确定字符串是否仅包含字母数字字符(或空格)

时间:2010-05-28 05:47:28

标签: c++ string iterator

我正在编写一个函数来确定字符串是否只包含字母数字字符和空格。我正在有效地测试它是否与正则表达式^[[: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 ++”方式来实现这一目标?

4 个答案:

答案 0 :(得分:26)

对我来说很好,但您可以使用isalnum(c)代替isalphaisdigit

答案 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