Archive dans mars 2020

Tester si une chaîne de caractère est un réel à l’aide de regex.

Tester si une chaîne de caractère est un réel à l’aide de regex.

L’objectif est de tester si une chaîne de caractère représente un nombre réel (float, double, long double). Pour ce faire j’ai décidé d’utiliser une expression régulière.

Voici l’expression régulière:

(^[\s]*[-+]?[0-9]*?\.?[0-9]+([eE][-+]?[0-9]+)?[\s]*|^[\s]*[-+]?[0-9]+\.?[\s]*)

Le lien de l’expression avec les tests est disponible sur regex101.com
L’expression est divisée en deux groupes (groupe1|groupe2). Le groupe 1 ne peut détecter de réel dans la chaîne de caractère qui suit «1.», c’est au groupe 2 qu’il incombe de le détecter.

Le problème de regex101 c’est qu’il ne génère pas l’implémentation pour c++.

La voici:

#include <iostream>
#include <string>
#include <regex>

const std::regex g_RealRegType(R"((^[\s]*[-+]?[0-9]*?\.?[0-9]+([eE][-+]?[0-9]+)?[\s]*$|^[\s]*[-+]?[0-9]+\.?[\s]*$))");

bool IsReal(const std::string& value)
{
    return std::regex_match(value, g_RealRegType);
}

int main()
{
    std::string str1 = "1" ;
    std::string str2 = "3.14159";
    std::string str3 = ".";    

    std::cout << "IsReal(\"" << str1 << "\") is " << std::boolalpha << IsReal(str1) << std::endl;
    std::cout << "IsReal(\"" << str2 << "\") is " << std::boolalpha << IsReal(str2) << std::endl;
    std::cout << "IsReal(\"" << str3 << "\") is " << std::boolalpha << IsReal(str3) << std::endl;
}

Le code est disponible sur coliru

Vous pouvez ensuite convertir les chaînes de caractère à l’aide des fonctions
std::stof, std::stod, std::stold

Voici les liens qui m’ont aidé:
https://www.regular-expressions.info/floatingpoint.html
https://ideone.com/lyDtfi
https://solarianprogrammer.com/2011/10/12/cpp-11-regex-tutorial/
https://stackoverflow.com/questions/447206/c-isfloat-function