J'écris une fonction qui détermine si une chaîne ne contient que des caractères alphanumériques et des espaces. Je teste effectivement s'il correspond à l'expression régulière ^[[:alnum:] ]+$
mais sans utiliser d'expressions régulières. Voici ce que j'ai jusqu'à présent:
#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();
}
Existe-t-il une meilleure solution ou une manière "plus C++" de le faire?
Cela me semble bien, mais vous pouvez utiliser isalnum(c)
au lieu de isalpha
et isdigit
.
Et dans l'attente de C++ 0x, vous pourrez utiliser les fonctions lambda (vous pouvez essayer ceci avec gcc 4.5 ou VS2010):
bool string_is_valid(const std::string &str)
{
return find_if(str.begin(), str.end(),
[](char c) { return !(isalnum(c) || (c == ' ')); }) == str.end();
}
Vous pouvez également le faire avec des classeurs afin de pouvoir supprimer la fonction d'assistance. Je recommande Boost Binders car ils sont beaucoup plus faciles à utiliser que les classeurs de bibliothèque standard:
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();
}
Points mineurs, mais si vous voulez que is_not_alnum_space () soit une fonction d'assistance qui n'est visible que dans cette unité de compilation particulière, vous devez la placer dans un espace de noms anonyme au lieu de la rendre statique:
namespace {
bool is_not_alnum_space(char c)
{
return !(isalpha(c) || isdigit(c) || (c == ' '));
}
}
...etc