代码之家  ›  专栏  ›  技术社区  ›  dreamlax

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

  •  25
  • dreamlax  · 技术社区  · 15 年前

    我正在编写一个函数来确定字符串是否只包含字母数字字符和空格。我正在有效地测试它是否与正则表达式匹配 ^[[: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 回复  |  直到 9 年前
        1
  •  25
  •   Matt Curtis    15 年前

    我觉得不错,但你可以用 isalnum(c) 而不是 isalpha isdigit .

        2
  •  8
  •   R Samuel Klatchko    15 年前

    期待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();
    }
    
        3
  •  2
  •   R Samuel Klatchko    15 年前

    您也可以使用绑定器来完成这项工作,这样您就可以删除helper函数。我建议 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();
    }
    
        4
  •  1
  •   Ilkka    15 年前

    小点,但如果您希望Not_Alnum_Space()是仅在特定编译单元中可见的辅助函数,则应将其放在匿名命名空间中,而不是使其成为静态的:

    namespace {
    bool is_not_alnum_space(char c)
    {
        return !(isalpha(c) || isdigit(c) || (c == ' '));
    }
    }
    ...etc