C++ 正在验证不带正则表达式的电子邮件地址

C++ 正在验证不带正则表达式的电子邮件地址,c++,c++11,winapi,boost,mfc,C++,C++11,Winapi,Boost,Mfc,这一定有一个规范的答案,但我找不到。。。答案表明regex并不是验证电子邮件的最佳方式。在线搜索不断找到大量基于正则表达式的答案 这个问题是关于PHP的,答案引用了一个方便的类MailAddress。C有一些非常相似的东西,但是普通的C++呢?是否有一个boost/C++11实用程序可以消除所有的痛苦?或者WinAPI/MFC中的某些东西,甚至?我必须编写一个解决方案,因为我安装了一个不支持std::regex(应用程序崩溃)的g++版本,并且我不想为一次电子邮件验证而升级它,因为这个应用程序可

这一定有一个规范的答案,但我找不到。。。答案表明regex并不是验证电子邮件的最佳方式。在线搜索不断找到大量基于正则表达式的答案


这个问题是关于PHP的,答案引用了一个方便的类
MailAddress
。C有一些非常相似的东西,但是普通的C++呢?是否有一个boost/C++11实用程序可以消除所有的痛苦?或者WinAPI/MFC中的某些东西,甚至?

我必须编写一个解决方案,因为我安装了一个不支持std::regex(应用程序崩溃)的g++版本,并且我不想为一次电子邮件验证而升级它,因为这个应用程序可能永远不需要任何进一步的regex。我编写了一个函数来完成这项工作。您甚至可以根据需要轻松缩放电子邮件地址每个部分的允许字符(在@之前、@之后和“.”之后)。写起来花了20分钟,比一次函数调用就搞乱编译器和环境要容易得多

给你,玩得开心:

bool emailAddressIsValid(std::string _email)
{
    bool retVal = false;

    //Tolower cast
    std::transform(_email.begin(), _email.end(), _email.begin(), ::tolower);

    //Edit these to change valid characters you want to be supported to be valid. You can edit it for each section. Remember to edit the array size in the for-loops below.

    const char* validCharsName = "abcdefghijklmnopqrstuvwxyz0123456789.%+_-"; //length = 41, change in loop
    const char* validCharsDomain = "abcdefghijklmnopqrstuvwxyz0123456789.-"; //length = 38, changein loop
    const char* validCharsTld = "abcdefghijklmnopqrstuvwxyz"; //length = 26, change in loop

    bool invalidCharacterFound = false;
    bool atFound = false;
    bool dotAfterAtFound = false;
    uint16_t letterCountBeforeAt = 0;
    uint16_t letterCountAfterAt = 0;
    uint16_t letterCountAfterDot = 0;

    for (uint16_t i = 0; i < _email.length(); i++) {
        char currentLetter = _email[i];

        //Found first @? Lets mark that and continue
        if (atFound == false && dotAfterAtFound == false && currentLetter == '@') {
            atFound = true;
            continue;
        }

        //Found '.' after @? lets mark that and continue
        if (atFound == true && dotAfterAtFound == false && currentLetter == '.') {
            dotAfterAtFound = true;
            continue;
        }

        //Count characters before @ (must be > 0)
        if (atFound == false && dotAfterAtFound == false) {
            letterCountBeforeAt++;
        }

        //Count characters after @ (must be > 0)
        if (atFound == true && dotAfterAtFound == false) {
            letterCountAfterAt++;
        }

        //Count characters after '.'(dot) after @ (must be between 2 and 6 characters (.tld)
        if (atFound == true && dotAfterAtFound == true) {
            letterCountAfterDot++;
        }

        //Validate characters, before '@'
        if (atFound == false && dotAfterAtFound == false) {
            bool isValidCharacter = false;
            for (uint16_t j = 0; j < 41; j++) {
                if (validCharsName[j] == currentLetter) {
                    isValidCharacter = true;
                    break;
                }
            }
            if (isValidCharacter == false) {
                invalidCharacterFound = true;
                break;
            }
        }

        //Validate characters, after '@', before '.' (dot)
        if (atFound == true && dotAfterAtFound == false) {
            bool isValidCharacter = false;
            for (uint16_t k = 0; k < 38; k++) {
                if (validCharsDomain[k] == currentLetter) {
                    isValidCharacter = true;
                    break;
                }
            }
            if (isValidCharacter == false) {
                invalidCharacterFound = true;
                break;
            }
        }

        //After '.' (dot), and after '@' (.tld)
        if (atFound == true && dotAfterAtFound == true) {
            bool isValidCharacter = false;
            for (uint16_t m = 0; m < 26; m++) {
                if (validCharsTld[m] == currentLetter) {
                    isValidCharacter = true;
                    break;
                }
            }
            if (isValidCharacter == false) {
                invalidCharacterFound = true;
                break;
            }
        }

        //Break the loop to speed up thigns if one character was invalid
        if (invalidCharacterFound == true) {
            break;
        }
    }

    //Compare collected information and finalize validation. If all matches: retVal -> true!
    if (atFound == true && dotAfterAtFound == true && invalidCharacterFound == false && letterCountBeforeAt >= 1 && letterCountAfterAt >= 1 && letterCountAfterDot >= 2 && letterCountAfterDot <= 6) {
        retVal = true;
    }

    return retVal;
}
bool emailAddressIsValid(std::string\u email)
{
bool-retVal=false;
//托洛威尔铸件
std::transform(_email.begin(),_email.end(),_email.begin(),::tolower);
//编辑这些以将您希望支持的有效字符更改为有效字符。您可以对每个节进行编辑。请记住在下面的for循环中编辑数组大小。
const char*validCharsName=“abcdefghijklmnopqrstuvxyz012456789.%+-”;//长度=41,在循环中更改
const char*validCharsDomain=“abcdefghijklmnopqrstuvxyz012456789-;//长度=38,在循环中更改
const char*validCharsTld=“abcdefghijklmnopqrstuvxyz”//length=26,循环中的更改
bool invalidCharacterFound=false;
bool-atFound=false;
bool dotaftafteratfound=false;
uint16\u t letterCountBeforeAt=0;
uint16\u t letterCountAfterAt=0;
uint16\u t letterCountAfterDot=0;
对于(uint16_t i=0;i<\u email.length();i++){
char currentLetter=_电子邮件[i];
//找到第一个@?让我们标记它并继续
if(atFound==false&&dotAfterAtFound==false&¤tLetter==='@')){
atFound=true;
继续;
}
//在@之后找到“.”让我们标记它并继续
if(atFound==true&&dotAfterAtFound==false&¤tLetter=='.')){
dotAfterAtFound=true;
继续;
}
//在@之前计数字符(必须大于0)
if(atFound==false&&dotAfterAtFound==false){
letterCountBeforeAt++;
}
//在@之后计数字符(必须大于0)
if(atFound==true&&dotAfterAtFound==false){
letterCountAfterAt++;
}
//在@之后计算“.”(点)之后的字符数(必须介于2到6个字符(.tld)之间)
if(atFound==true&&dotAfterAtFound==true){
letterCountAfterDot++;
}
//验证字符,在“@”之前
if(atFound==false&&dotAfterAtFound==false){
bool isValidCharacter=false;
对于(uint16_t j=0;j<41;j++){
if(validCharsName[j]==currentLetter){
isValidCharacter=true;
打破
}
}
if(isValidCharacter==false){
invalidCharacterFound=true;
打破
}
}
//验证字符,在“@”之后,“.”之前(点)
if(atFound==true&&dotAfterAtFound==false){
bool isValidCharacter=false;
对于(uint16_t k=0;k<38;k++){
if(validCharsDomain[k]==currentLetter){
isValidCharacter=true;
打破
}
}
if(isValidCharacter==false){
invalidCharacterFound=true;
打破
}
}
//在“.”(点)之后和“@”(.tld)之后
if(atFound==true&&dotAfterAtFound==true){
bool isValidCharacter=false;
对于(uint16_t m=0;m<26;m++){
if(validCharsTld[m]==currentLetter){
isValidCharacter=true;
打破
}
}
if(isValidCharacter==false){
invalidCharacterFound=true;
打破
}
}
//如果一个字符无效,则中断循环以加速thigns
if(invalidCharacterFound==true){
打破
}
}
//比较收集的信息并完成验证。如果所有匹配:retVal->true!

如果(atFound==true&&dotAfterAtFound==true&&invalidCharacterFound==false&&letterCountBeforeAt>=1&&letterCountAfterAt>=1&&letterCountAfterDot>=2&&letterCountAfterDot,我必须编写一个解决方案,因为我安装了一个不支持std::regex(应用程序崩溃)的g++版本我不想为了一次电子邮件验证而升级它,因为这个应用程序可能永远不需要任何进一步的正则表达式。我编写了一个函数来完成这项工作。你甚至可以轻松地为电子邮件地址的每个部分(在@之前、之后和之后)缩放允许的字符根据您的需要进行开发。编写代码需要20分钟,这比只调用一个函数就搞乱编译器和环境要容易得多

给你,玩得开心:

bool emailAddressIsValid(std::string _email)
{
    bool retVal = false;

    //Tolower cast
    std::transform(_email.begin(), _email.end(), _email.begin(), ::tolower);

    //Edit these to change valid characters you want to be supported to be valid. You can edit it for each section. Remember to edit the array size in the for-loops below.

    const char* validCharsName = "abcdefghijklmnopqrstuvwxyz0123456789.%+_-"; //length = 41, change in loop
    const char* validCharsDomain = "abcdefghijklmnopqrstuvwxyz0123456789.-"; //length = 38, changein loop
    const char* validCharsTld = "abcdefghijklmnopqrstuvwxyz"; //length = 26, change in loop

    bool invalidCharacterFound = false;
    bool atFound = false;
    bool dotAfterAtFound = false;
    uint16_t letterCountBeforeAt = 0;
    uint16_t letterCountAfterAt = 0;
    uint16_t letterCountAfterDot = 0;

    for (uint16_t i = 0; i < _email.length(); i++) {
        char currentLetter = _email[i];

        //Found first @? Lets mark that and continue
        if (atFound == false && dotAfterAtFound == false && currentLetter == '@') {
            atFound = true;
            continue;
        }

        //Found '.' after @? lets mark that and continue
        if (atFound == true && dotAfterAtFound == false && currentLetter == '.') {
            dotAfterAtFound = true;
            continue;
        }

        //Count characters before @ (must be > 0)
        if (atFound == false && dotAfterAtFound == false) {
            letterCountBeforeAt++;
        }

        //Count characters after @ (must be > 0)
        if (atFound == true && dotAfterAtFound == false) {
            letterCountAfterAt++;
        }

        //Count characters after '.'(dot) after @ (must be between 2 and 6 characters (.tld)
        if (atFound == true && dotAfterAtFound == true) {
            letterCountAfterDot++;
        }

        //Validate characters, before '@'
        if (atFound == false && dotAfterAtFound == false) {
            bool isValidCharacter = false;
            for (uint16_t j = 0; j < 41; j++) {
                if (validCharsName[j] == currentLetter) {
                    isValidCharacter = true;
                    break;
                }
            }
            if (isValidCharacter == false) {
                invalidCharacterFound = true;
                break;
            }
        }

        //Validate characters, after '@', before '.' (dot)
        if (atFound == true && dotAfterAtFound == false) {
            bool isValidCharacter = false;
            for (uint16_t k = 0; k < 38; k++) {
                if (validCharsDomain[k] == currentLetter) {
                    isValidCharacter = true;
                    break;
                }
            }
            if (isValidCharacter == false) {
                invalidCharacterFound = true;
                break;
            }
        }

        //After '.' (dot), and after '@' (.tld)
        if (atFound == true && dotAfterAtFound == true) {
            bool isValidCharacter = false;
            for (uint16_t m = 0; m < 26; m++) {
                if (validCharsTld[m] == currentLetter) {
                    isValidCharacter = true;
                    break;
                }
            }
            if (isValidCharacter == false) {
                invalidCharacterFound = true;
                break;
            }
        }

        //Break the loop to speed up thigns if one character was invalid
        if (invalidCharacterFound == true) {
            break;
        }
    }

    //Compare collected information and finalize validation. If all matches: retVal -> true!
    if (atFound == true && dotAfterAtFound == true && invalidCharacterFound == false && letterCountBeforeAt >= 1 && letterCountAfterAt >= 1 && letterCountAfterDot >= 2 && letterCountAfterDot <= 6) {
        retVal = true;
    }

    return retVal;
}
bool emailAddressIsValid(std::string\u email)
{
bool-retVal=false;
//托洛威尔铸件
std::transform(_email.begin(),_email.end(),_email.begin(),::tolower);
//编辑这些以将您希望支持的有效字符更改为有效字符。您可以对每个节进行编辑。请记住在下面的for循环中编辑数组大小。
const char*validCharsName=“abcdefghijklmnopqrstuvxyz012456789.%+-”;//长度=41,在循环中更改
const char*validCharsDomain=“abcdefghijklmnopqrstuvxyz012456789。-;//l