2011-10-01 69 views
1

這可能在某個地方被回答之前,但因爲有數百萬與字符串格式無關的帖子。檢查字符串的格式

採取以下字符串:

24:東西(真,假,真)[0,1,0]

我希望能夠做兩件事情在這種情況下, 。我需要檢查以下所有條件是否爲真:

  • 只有一個:使用斯普利特(),我需要使用反正兩個部分分開來實現。
  • 前的整數:是一個1-3位INT簡單int.parse邏輯
  • 的()存在,並且所述「東西」,在這種情況下任何字符串少於10個字符,是否有
  • []存在並且至少有一個整數。此外,請確保[]中的元素是用整數分隔的整數,

我該如何做到最好? 編輯:我劃掉了迄今爲止取得的成就。

+0

爲了檢查一切後:我現在有兩個拆分成字符串。 :之後的整個部分存儲在一個字符串中,這將更容易檢查。 –

+0

你想在()中做什麼?真/假statemets由「,」分隔? –

回答

3

正則表達式是最快捷的方式。取決於複雜性,它也可能是計算量最大的。

這似乎是你需要什麼(我沒那麼好,所以有可能是更好的方式來做到這一點):

^\d{1,3}:\w{1,9}\((true|false)(;true|;false)*\)\[\d(,[\d])*\]$

說明

\d{1,3} 1至3數字

: 後跟冒號

\w{1,9} 後跟一個1-9字符字母數字串

\((true|false)(;true|;false)*\) 後跟包含括號「真」或「假」,隨後通過任何數量的「真」或「假」 ,

\[\d(,[\d])*\] 後面跟着另一組包含數字的括號,後面跟着任意數量的逗號+數字。

在字符串的開頭和結尾處的^和$表示字符串的開始和結尾,這是重要的,因爲我們試圖驗證整個字符串與格式匹配。

代碼示例

var input = "24:Something(true;false;true)[0,1,0]"; 

var regex = new System.Text.RegularExpressions.Regex(@"^\d{1,3}:.{1,9}\(.*\)\[\d(,[\d])*\]$"); 
bool isFormattedCorrectly = regex.IsMatch(input); 

信用@伊恩·尼爾森

+0

嗨,請參閱我已編入的編輯內容,並幫助我瞭解您的正則表達式的含義 - 我對他們來說很陌生。 –

+0

剛剛添加了幾個' - 否則表達式中的* s被用作格式化指標... –

+1

您無法解釋或閱讀RegEx,您只需將其寫入! :) – kenny

2

這是您唯一明智的選擇是使用正則表達式的情況之一。

我草率的嘗試是這樣的:

var input = "24:Something(true;false;true)[0,1,0]"; 

var regex = new System.Text.RegularExpressions.Regex(@"^\d{1,3}:.{1,9}\(.*\)\[\d(,[\d])*\]$"); 

System.Diagnostics.Debug.Assert(regex.IsMatch(input)); 

This online RegEx tester should help refine the expression.

+0

我對Regex's很新,請更具體地幫助我。謝謝! –

+0

真棒,就是我正要去尋找測試。將現在使用... –

+0

非常好的答案。謝謝。我接受另一個,因爲它有解釋,但如果我能接受兩個,我也會接受你的。 –

1

我認爲,最好的辦法是使用正則表達式是這樣的:

string s = "24:Something(true;false;true)[0,1,0]"; 
Regex pattern = new Regex(@"^\d{1,3}:[a-zA-z]{1,10}\((true|false)(;true|;false)*\)\[\d(,\d)*\]$"); 

if (pattern.IsMatch(s)) 
{ 
    // s is valid 
} 

如果你想裏面任何東西( ),您可以使用以下正則表達式:

@"^\d{1,3}:[a-zA-z]{1,10}\([^:\(]*\)\[\d(,\d)*\]$" 
+0

將使用此代碼。謝謝。 –