2012-07-12 54 views
3

我需要驗證字符串。該字符串的格式類似於「V02:01:02:03:04」。
我所試圖做的
1)我要檢查正確的長度提供
2)第一個字符是「V」
3)所有其他字符是2個字母數字和由冒號和分離正確的位置。
4)沒有空白標籤et.c
4)不能相信任何更多的驗證。驗證字符串按數字和冒號

我做了什麼至今
1)功能已經很容易地檢查LEN和拳頭字符無法驗證後續字符後先不包含字母或空間。但我有點卡住瞭如何檢查每個冒號後的冒號位置和2個字母的字符。

以下是我的嘗試。

int firmwareVerLen = 15; 
const std::string input = "V02:01:02:03:04"; // this is the format string user will input with changes only in digits. 
bool validateInput(const std::string& input) 
{ 
    typedef std::string::size_type stringSize; 
    bool result = true ; 
    if(firmwareVerLen != (int)input.size()) 
    {  
     std::cout <<" len failed" << std::endl; 
     result = false ; 
    } 

    if(true == result) 
    { 

     if(input.find_first_of('V', 0)) 
     { 
      std::cout <<" The First Character is not 'V' " << std::endl; 
      result = false ; 
     } 
    } 

    if(true == result) 
    { 
     for(stringSize i = 1 ; i!= input.size(); ++ i) 
     { 
      if(isspace(input[i])) 
      { 
       result = false; 
       break; 
      } 
      if(isalpha(input[i])) 
      { 
       cout<<" alpha found "; 
       result = false; 
       break; 
      } 

      //how to check further that characters are digits and are correctly separated by colon 
     } 
    } 

    return result; 
} 
+1

老實說,我可能會遍歷字符串,檢查每個字符與當前驗證列表中字符串的位置。 – chris 2012-07-12 16:13:23

+2

正則表達式? 'V([0-9] {2}:){5}'......我想。 – hmjd 2012-07-12 16:15:28

+0

@hmjd,哇,現在你提到它... – chris 2012-07-12 16:16:30

回答

0

這麼短的短輸入和嚴格的格式,我可能會做這樣的事:

bool validateInput(const std::string& input) 
{ 
    static const size_t digit_indices[10] = {1, 2, 4, 5, 7, 8, 10, 11, 13, 14}; 
    static const size_t colon_indices[4] = {3, 6, 9, 12}; 
    static const size_t firmwareVerLen = 15; 

    static const size_t n_digits = sizeof(digit_indices)/sizeof(size_t); 
    static const size_t n_colons = sizeof(colon_indices)/sizeof(size_t); 

    if (input.size() != firmwareVerLen) return false;  // check 1) 
    if (input[0] != 'V') return false;     // check 2) 

    for (size_t i = 0; i < n_digits; ++i)      // check 3) 
     if (!is_digit(input[digit_indices[i]]) return false; 

    for (size_t i = 0; i < n_colons; ++i)      // check 3) 
     if (input[colon_indices[i]] != ':') return false; 

    // check 4) isn't needed 

    return true; 
} 

相當容易,如果十個分量輸入格式的變化,IMO。

+0

謝謝你,你的解決方案是晶圓廠..不僅它服務於我的purppose,而且幫助我學習新的東西。萬分感謝.. – samantha 2012-07-13 08:46:13

2

如果是這樣嚴格的驗證,爲什麼不檢查字符的性格?例如(給你所做的大小的話)

if (input[0] != 'V') 
    return false; 
    if (!std::isdigit(input[1]) || !std::isdigit(input[2])) 
    return false; 
    if (input[3] != ':') 
    return false; 
    // etc... 
+1

我仍然奉勸循環結構的地方。 – 2012-07-12 16:30:46

0

與第一個數字開始,所有字符必須是不同的,如果有位置模3爲0,比它必須是一個冒號數字。

HTH託斯滕