【问题标题】:String format verification without regex (C++03)无正则表达式的字符串格式验证 (C++03)
【发布时间】:2013-03-16 04:50:13
【问题描述】:

有谁知道在不使用 C++11 正则表达式类的情况下验证 C++ 中字符串格式的更好方法。基本上我有几个这种格式的字符串 标签1:值,标签2:值,标签1:值,标签2:值

TAG1和TAG2是字符串,VALUE是不同长度的整数值

示例字符串为:“PPS:112, FJ:543, PPS:76432, FJ:753” 等等。

我需要一个函数来验证格式是否完全正确。

到目前为止,我正在逐个字符验证。这似乎充其量是乏味的。有没有更好的方法,我根本不知道。除非必须,否则我想再次避免使用 C++11 或任何第三方库中的正则表达式。我主要想知道是否有更好的方法来使用 C++ 和 STL 来做到这一点

【问题讨论】:

    标签: c++ string format verification c++03


    【解决方案1】:

    根本不使用任何第三方库,不是真的。使用标准库组件的最佳效果如下:

    #include <string>
    #include <algorithm>
    
    bool verify(const std::string& s)
    {
        typedef std::string::size_type      size_type;
        typedef std::string::const_iterator cstr_it;
    
        size_type colon_index = s.find(":");
    
        if (colon_index == std::string::npos)
        {
            return false;
        }
    
        cstr_it letter_end = s.begin() + colon_index;
        bool valid_letter = std::all_of(s.begin(), letter_end, isupper);
        bool valid_number = std::all_of(letter_end, s.end(), isdigit);
    
        return valid_letter && valid_number;
    }
    

    【讨论】:

    • 这仅验证部分字符串,例如 TAG:123。我需要像我的原始示例一样验证整个字符串。我的字符串很长(每个字符串 1000+ 个标签)但是整个字符串需要采用这种格式,并带有逗号和空格,就像我之前展示的那样。此外,我必须确保只有两个标签并且它们交替出现,例如 FIZZ:123、BUZZ:653、FIZZ:4236、BUZZ:234。这对于正则表达式非常简单,但在 C++ 中我不知所措。当然,我可以在循环中使用这个函数来验证每个子字符串,但这似乎非常低效。
    • 正则表达式不会更有效。在幕后,它基本上在做同样的事情——只是更简洁。
    • 注意:all_of 是 C++11 扩展。如果您在算法标头中没有这些函数,您将需要从 en.cppreference.com/w/cpp/algorithm/all_any_none_of 获取一些实现代码以获取 all_offind_if_not
    猜你喜欢
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多