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

dre*_*lax 26 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();
}
Run Code Online (Sandbox Code Playgroud)

是否有更好的解决方案或"更多C++"方式来做到这一点?

小智 26

对我来说很好看,但你可以用isalnum(c)而不是isalphaisdigit.

  • +1.如果要计算其他类型的空格(例如制表符),也可以使用`isspace()`. (7认同)
  • @Johnsyweb:虽然不行.对于包含*至少一个*字母数字+空格字符的字符串,它将返回"true",但我想确保它们是*all*字母数字+空格字符.`find_if`的目的是找到满足谓词的第一个元素,谓词是"非字母数字或空格".如果我们得到`str.end()`我们知道没有字符满足谓词,所以它们都必须是字母数字或空格字符. (5认同)
  • @Johnsyweb如果你想让它更具可读性,请使用find_if_not;) (2认同)

R S*_*hko 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();
}
Run Code Online (Sandbox Code Playgroud)

  • 语法最初令人困惑,但我确信我会习惯它. (2认同)