【问题标题】:How to check if the any SYMBOL exists in the string except '-','_','.', '@' in C++?c++ - 如何检查字符串中是否存在除'-','_','.','@'之外的任何符号?
【发布时间】:2015-04-05 09:41:47
【问题描述】:

我现在正在编写电子邮件验证器,我想检查字符串是否包含除 '-'、'_'、'.'、'@' 之外的任何符号(不是数字或字符)。如果它不包含,我必须提高名为“counter”的变量。

这是我迄今为止尝试过的:

for (int i = 0; i < mail.length(); i++) {
        if ((mail[i] >= 'A' && mail[i] <= 'Z') || (mail[i] >= 'a' && mail[i] <= 'z') || (mail[i] >= '0' && mail[i] <= '9') || (mail[i] == '.' || mail[i] == '-') || (mail[i] == '@' || mail[i] == '_')) {
            if(i == mail.length()) {
                counter+=1;
                break;
            } 
        }
    }

【问题讨论】:

  • 正则表达式,提升字符串算法,一个简单的std::find_if...
  • 让你的 if 更容易使用&lt;cctype&gt;
  • 我想在没有正则表达式的情况下这样做,因为我是初学者。所以我想要更简单的算法。
  • i 永远不能是mail.length()
  • @Bartek 正则表达式的问题是你现在有两个问题(或者如果你使用标准库的正则表达式计算的话,三个问题)

标签: c++


【解决方案1】:

您可以检查是否有符号不在您的集合中:

size_t pos = mail.find_first_not_of( "-_.@" );
if( pos != std::string::npos )
    ++counter;

如果整个字符串有任何不属于该集合的符号,则此代码会增加一次计数器,即它基于问题描述而不是您的代码,它会尝试计算有多少符号不属于该集合。

【讨论】:

    【解决方案2】:

    您可以通过 boost 使用正则表达式。如果我正确理解了您的问题,您想检查不包含字母、数字和“-_.@”的字符串。下面显示了一个示例实现。根据您的需要调整代码:

    // std
    #include <iostream>
    using namespace std;
    // boost
    #include <boost/regex.hpp>
    
    int main () {
        unsigned int counter = 0;
        // ... my code ...
        string myString = "foo%1@.com";
        boost::regex myRegex("[^a-zA-Z_.@-]+");
        if (boost::regex_search(myString, myRegex)) {
            counter++;
        }
       // ... my code ...
        return 0;
    }
    

    更新

    为了编译代码,您需要安装 boost 库。您不需要全部安装。只要确保安装libboost-regex。对于编译,您可以使用以下命令链接必要的 boost 库:

    g++ -o main main.cpp -lboost_regex
    

    【讨论】:

    • 请给我你使用的库文件的链接。
    • 是的,但我有一个错误:错误 LNK1104:无法打开文件“libboost_regex-vc120-mt-gd-1_57.lib”。你能告诉我,这是什么错误?我已将 boost 库添加到 VS 2013 中。我看到了您的更新,但我在 Windows 操作系统中。
    • 我使用VC已经有一段时间了。有很多可能的原因。我猜您正确添加了库。如果您有疑问,请观看此视频(直到第 3 分钟为止),该视频展示了如何添加库 youtube.com/watch?v=4MdTqNDrPSY。该示例使用 OpenCV,但您可以轻松适应您的需求。
    • 接下来,我要检查的是空格的问题。请参阅此页面上的第一个答案 stackoverflow.com/questions/133698/… 。您需要确保在 Additional Dependencies 属性窗口中将包含空格的链接放在引号 "..." 中。在视频中,这个窗口显示在 2:36 分钟。
    • 非常感谢。我已经修复了错误。问题是我没有更改 boost 库的平台工具集。
    猜你喜欢
    • 2022-11-19
    • 2017-05-09
    • 1970-01-01
    • 2012-05-25
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 2013-08-20
    相关资源
    最近更新 更多