2012-05-25 32 views
1

我需要驗證文件的文本包含以下格式的文本:驗證文件的文本匹配一定的格式

#0
DIRECTION: FORWARD
SPEED: 10
TIME: 10

OR

#1
DIRECTION: REVERSE
SPEED: 10
ROTATIONS: 10

而且這將重複多個步驟。

#必須跟一個數字,DIRECTION必須跟FORWARDREVERSESPEED必須跟一個數字和最後一行之後,將一些或者TIMEROTATIONS

我想驗證文件是否包含此格式的文本,並且在開始讀取值之前不會出現一些奇怪的值。
我可以使用某種類型的通配符嗎?我已經開始研究正則表達式,但我之前沒有使用它。
我想什麼做的是做一些類型比較,其中數字是通配符,這樣,我知道,如果行包含的基本格式:

if(fileLines[0].Matches("#%")) // Where % would be the wildcard? 
if(fileLines[1].Matches("DIRECTION:%")) // Does something like this exist? 
+0

如果您打算檢查格式,然後閱讀我建議在數值中讀取這些值,並在檢查時檢查它們。這樣,如果值不正確,您將能夠提供更簡潔的錯誤消息。 – NominSim

+0

我想在讀取值之前驗證行是否正確。如果這些行不符合要求,我不想讀取該值。 –

+0

爲什麼不使用正則表達式?它們非常適合基本的文本驗證,就像你在這裏試圖實現的一樣。 – qJake

回答

1

這種模式似乎工作

string[] lines = 
    { 
     "#0", 
     "DIRECTION: FORWARD", 
     "SPEED: 10", 
     "TIME: 10" 
    }; 

     // meaning At start of line there is a # followed by digits till the end of line 
    if(checkLine(@"^#\d+$", lines[0]) == false) 
     Console.WriteLine("False on line 1"); 
    else 
     Console.WriteLine("True on line 1"); 

     // meaning At start of line there is the word DIRECTION: followed by space and the words REVERSE or FORWARD 
    if(checkLine(@"^DIRECTION: (REVERSE|FORWARD)", lines[1]) == false) 
     Console.WriteLine("False on line 2"); 
    else 
     Console.WriteLine("True on line 2"); 

     // meaning At start of line there is the word SPEED: followed by a space and digits till the end of the line 
    if(checkLine(@"^SPEED: \d+$", lines[2]) == false) 
     Console.WriteLine("False on line 3"); 
    else 
     Console.WriteLine("True on line 3"); 

     // meaning At start of line there are the words TIME or ROTATIONS followed by colon, space and digits till the end of the line 
    if(checkLine(@"^(TIME|ROTATIONS): \d+$", lines[3]) == false) 
     Console.WriteLine("False on line 4"); 
    else 
     Console.WriteLine("True on line 4"); 
} 

// Define other methods and classes here 
private bool checkLine(string regExp, string line) 
{ 
    Regex r = new Regex(regExp); 
    return r.IsMatch(line); 
} 
+0

謝謝!這很好。 –

0

假設您已經將文件中的所有行作爲通用列表讀取。

 List<string> fileLines = new List<string>(); 
     fileLines.Add("#0"); 
     fileLines.Add("DIRECTION: FORWARD"); 
     fileLines.Add("SPEED: 10"); 
     fileLines.Add("TIME: 10"); 
     fileLines.Add("#1"); 
     fileLines.Add("DIRECTION: REVERSE"); 
     fileLines.Add("SPEED: 10"); 
     fileLines.Add("ROTATIONS: 10"); 

。利用此功能來驗證文件是否有效

信用:史蒂夫的正則表達式實現

public bool CheckConsistancy(List<string> fileLines) 
    { 
     bool status = false; 
     if (fileLines != null && fileLines.Count > 0) 
     { 
      if(fileLines.Count % 4 == 0) 
      { 
       List<List<string>> fileLineGroups = fileLines.Select((x, i) => new { Index = i, Value = x }).GroupBy(x => x.Index/4).Select(x => x.Select(v => v.Value).ToList()).ToList(); 
       foreach (List<string> fileLineGroup in fileLineGroups) 
       { 
        if (checkLine(@"^#\d", fileLineGroup[0])) 
        { 
         if (checkLine(@"^DIRECTION: (REVERSE|FORWARD)", fileLineGroup[1])) 
         { 
          if (checkLine(@"^SPEED: \d", fileLineGroup[2])) 
          { 
           if (checkLine(@"^(TIME|ROTATIONS): \d", fileLineGroup[3])) 
           { 
            status = true; 
           } 
           else 
           { 
            status = false; 
            break; 
           } 
          } 
          else 
          { 
           status = false; 
           break; 
          } 
         } 
         else 
         { 
          status = false; 
          break; 
         } 
        } 
        else 
        { 
         status = false; 
         break; 
        } 
       } 
      } 
      else 
      { 
       status = false; 
      } 
     } 
     return status; 
    } 

    private bool checkLine(string regExp, string line) 
    { 
     Regex r = new Regex(regExp); 
     return r.IsMatch(line); 
    } 

調用函數來檢查相合

bool status = CheckConsistancy(fileLines);