我是c#的初學者,我怎麼能寫一個代碼,檢查是否: 前3個字符是字母 接下來3個是數字, 下兩個字母 並且最後一個字符是數字。 如果是不寫錯誤信息。子串和Char.Is/Number混淆。
我試過使用子字符串(0,3),並把它對Char.IsLetter只是爲了嘗試但失敗。
我是c#的初學者,我怎麼能寫一個代碼,檢查是否: 前3個字符是字母 接下來3個是數字, 下兩個字母 並且最後一個字符是數字。 如果是不寫錯誤信息。子串和Char.Is/Number混淆。
我試過使用子字符串(0,3),並把它對Char.IsLetter只是爲了嘗試但失敗。
下面是使用char.IsLetter
和char.IsNumber
的正確方法。
if(myString.Length == 9
&& char.IsLetter(myString[0])
&& char.IsLetter(myString[1])
&& char.IsLetter(myString[2])
&& char.IsNumber(myString[3])
&& char.IsNumber(myString[4])
&& char.IsNumber(myString[5])
&& char.IsLetter(myString[6])
&& char.IsLetter(myString[7])
&& char.IsNumber(myString[8]))
{
// match.
}
基本上你已經驗證了字符串的長度,然後驗證每個字符。
你也可以使用char.IsDigit
來限制比賽進行到基數的10位與char.IsNumber
將匹配被視爲一個號碼的任何Unicode字符(分數,下標,上標,羅馬數字,貨幣numerators,圓圈內的編號,和腳本 - 具體數字)。此外,char.IsLetter
也將匹配任何被認爲是偏離基本A-Z之外的字母的Unicode字符。要將數字限制爲0-9並將字母限制爲A-Z,您可以改爲這樣。
public static IsAtoZ(char c)
{
return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z');
}
if(myString.Length == 9
&& IsAtoZ(myString[0])
&& IsAtoZ(myString[1])
&& IsAtoZ(myString[2])
&& char.IsDigit(myString[3])
&& char.IsDigit(myString[4])
&& char.IsDigit(myString[5])
&& IsAtoZ(myString[6])
&& IsAtoZ(myString[7])
&& char.IsDigit(myString[8]))
{
// match.
}
但說實話,在這一點上正則表達式會更簡潔。但請注意,您仍然需要考慮是否要匹配Unicode字符,並根據該字符使用正確的正則表達式。
你可以使用正則表達式
bool isMatch= Regex.IsMatch("abc123de4", @"\p{L}{3}\d{3}\p{L}{2}\d");
這也會匹配「!!!! abc123de4 $$$$」,因爲沒有錨。 – juharr
你可以只使用正則表達式:
var regex = new Regex("^[a-z]{3}[0-9]{2}[a-z]{2}[0-9]{1}$", RegexOptions.IgnoreCase);
var matces = regex.Matches(input);
其中input
是要檢查的字符串。
當我們將選項RegexOptions.IgnoreCase
傳遞給Regex
的構造函數時,我們說如果這些字母是大寫也沒關係。
您可以避免指定此參數並明確聲明您希望大寫字母和小寫字母,正如Rahul在其評論中正確指出的那樣。這就好比做如下:
var regex = new Regex("^[a-z][A-Z]{3}[0-9]{2}[a-z][A-Z]{2}[0-9]{1}$");
var matces = regex.Matches(input);
我認爲有幾種優雅的方式來做到這一點。既然你說你是一個初學者到C#,我建議只找最簡單的(最僞碼樣,恕我直言)的方式,只是表達問題/解決方案:
private bool MatchesPattern(string test)
{
// can't possibly match the pattern with less than 9 chars
if (test.Length < 9) return false;
int idx = 0;
// test are letters
for (int steps = 1; steps <= 3; steps++)
{
if (!char.IsLetter(test[idx++])) return false;
}
// test are numbers
for (int steps = 1; steps <= 3; steps++)
{
if (!char.IsNumber(test[idx++])) return false;
}
// test are letters
for (int steps = 1; steps <= 2; steps++)
{
if (!char.IsLetter(test[idx++])) return false;
}
// test last char is number
if (!char.IsNumber(test.Last())) return false;
return true;
}
您可以測試結果:
private void Test(string testValue)
{
if (!MatchesPattern(testValue))
{
Console.WriteLine("Error!");
}
}
您可以使用正則表達式 – Arash
當您說「字母」時,您的意思是一個Unicode字母嗎?作爲'Char.IsLetter'檢查? – Magnus
只是要清楚你的意思是一個9個字符的字符串。而不是以3個字母,3個數字,2個字母以及任意數量的字符開頭的字符串,只要最後一個字符是數字。 – juharr