2013-03-16 83 views
0

有誰知道更好的方式來驗證C++中的字符串格式,而不使用C++ 11正則表達式類。基本上我有在這種類型的格式 TAG1的幾個串:VALUE,TAG2:VALUE,TAG1:VALUE,TAG2:VALUE無正則表達式的字符串格式驗證(C++ 03)

TAG1和TAG2是字符串,值是各種長度

一個例子的整數值字符串將是:「PPS:112,FJ:543,PPS:76432,FJ:753」等等。

我需要一個函數來驗證格式是否正確。

到目前爲止,我正在進行字符驗證。這似乎很乏味。有沒有更好的方式,我根本不知道。再次,我想避免使用C++ 11或任何第三方庫的正則表達式,除非必須。我主要想知道是否有更好的方法來用C++和STL來做到這一點。

回答

2

根本沒有使用任何第三方庫。關於使用標準庫組件的最佳做法如下所示:

#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; 
} 
+0

這隻驗證字符串的一部分,如TAG:123。我需要驗證整個字符串,如我的原始示例。我的字符串非常長(每個字符串有1000個以上的標籤)但是整個字符串需要使用逗號和空格格式,正如我以前所示。此外,我必須確保只有兩個標籤,並且它們交替出現,如FIZZ:123,BUZZ:653,FIZZ:4236,BUZZ:234。這是非常簡單的正則表達式,但在C + +我很茫然。當然,我可以在循環中使用此函數來驗證每個子字符串,但這看起來非常低效。 – MadOgre 2013-03-16 08:55:24

+1

正則表達式不會更高效。在封面下它基本上做着完全相同的事情 - 它更簡潔。 – Yuushi 2013-03-16 11:52:56

+0

注意:'all_of'是C++ 11的擴展。如果算法頭中沒有這些函數,您將希望從http://en.cppreference.com/w/cpp/algorithm/all_any_none_of獲取一些實現代碼,用於「all_of」和「find_if_not」。 – Jon 2015-05-13 15:31:42

相關問題