我不同意,你應該使用常用表達。這可以使用簡單易讀的代碼輕鬆解決 - 無需過度複雜化。
首先,你已經完成了,你可以很容易地得到字符串的長度。如果它是一個有效的長度,那麼它只是檢查字符串中的每個字符是否有效的問題。您可以使用char中的IsDigit和IsLetter方法檢查字符串中的任何給定字符是數字還是字母。你可以寫一個方法,如:
public bool IsValidPostcode(string postcode)
{
return postcode.Length == 7
&& char.IsLetter(postcode[0])
&& char.IsLetter(postcode[2])
&& char.IsLetter(postcode[5])
&& char.IsDigit(postcode[1])
&& char.IsDigit(postcode[4])
&& char.IsDigit(postcode[6])
&& postcode[3] == ' ';
}
,並使用這個在您的例子,如:
if (IsValidPostcode(postalCode))
{
Console.WriteLine("Your Postal Code is " + postalCode);
}
else
{
Console.WriteLine("Error invalid Postal Code");
}
如果你想尋找到通過正則表達式解決這種情況,可以通過像達到同樣的效果:
bool validPostCode = Regex.Match(postalCode, @"^[a-zA-Z]\d[a-zA-Z] \d[a-zA-Z]\d$").Success;
編輯
如果從ISDIGIT和IsLetter約束條件是不適合的,在OP也可以建立允許的字符列表自己和對證:
public static bool IsValidPostcode(string postcode)
{
char[] validLetters = Enumerable.Range('a', 'z' - 'a' + 1)
.Concat(Enumerable.Range('A', 'Z' - 'A' + 1))
.Select(c => (char)c).ToArray();
char[] validNumbers = Enumerable.Range('0', 10).Select(c => (char)c).ToArray();
return postcode.Length == 7
&& validLetters.Contains(postcode[0])
&& validLetters.Contains(postcode[2])
&& validLetters.Contains(postcode[5])
&& validNumbers.Contains(postcode[1])
&& validNumbers.Contains(postcode[4])
&& validNumbers.Contains(postcode[6])
&& postcode[3] == ' ';
}
顯然validLetters
和validNumbers
會更適合作爲構建一次類成員,但爲了便於說明,我已將它們放在方法中。
研究正則表達式。您可以創建一個匹配該序列的表達式,並根據該表達式測試輸入。 – David
確切的問題是什麼? – Alejandro
[C#驗證美國或加拿大郵政編碼]可能的重複(http://stackoverflow.com/questions/14942602/c-validation-for-us-or-canadian-zip-code) –