2015-09-22 131 views
-1

我是c#的初學者,我怎麼能寫一個代碼,檢查是否: 前3個字符是字母 接下來3個是數字, 下兩個字母 並且最後一個字符是數字。 如果是不寫錯誤信息。子串和Char.Is/Number混淆。

我試過使用子字符串(0,3),並把它對Char.IsLetter只是爲了嘗試但失敗。

+2

您可以使用正則表達式 – Arash

+0

當您說「字母」時,您的意思是一個Unicode字母嗎?作爲'Char.IsLetter'檢查? – Magnus

+0

只是要清楚你的意思是一個9個字符的字符串。而不是以3個字母,3個數字,2個字母以及任意數量的字符開頭的字符串,只要最後一個字符是數字。 – juharr

回答

2

下面是使用char.IsLetterchar.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字符,並根據該字符使用正確的正則表達式。

+1

@ L.B什麼答案?我並不是說任何其他答案都是錯的,只是這就是你如何使用'char.IsLetter'和'char.IsNumber'來完成的。 – juharr

+0

嘿,別擔心......我認爲@LB剛剛從牀上起牀:) – Rahul

+0

我們不知道字符串的長度 – ivg

2

你可以使用正則表達式

bool isMatch= Regex.IsMatch("abc123de4", @"\p{L}{3}\d{3}\p{L}{2}\d"); 
+0

這也會匹配「!!!! abc123de4 $$$$」,因爲沒有錨。 – juharr

2

你可以只使用正則表達式:

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); 
+0

@Rahul我意識到這一點,但我認爲用這種方式寫得更加簡潔。感謝您的評論,我會將其納入我的回答。 – Christos

+0

這不會真的檢查它是否是一個Unicode字母。如果這是操作的意圖。 – Magnus

1

您可以訪問字符串的單個字符在C#這樣的:

string s = "1test"; 

char c = s[0]; 

Ç會那麼「1」之一。

在下一步中,您可以使用返回布爾的Char.IsNumber方法。就像這樣:

if(c.IsNumber()){} 

然後你做,除了你使用Char.IsLetter方法接下來的兩個字符同樣的事情。

+2

雖然我認爲正則表達式可能是一個更優雅的解決方案,但這種方法對初學者來說更容易理解。 –

+1

是的告訴初學者使用正則表達式不是一個好主意。 – lassedev

+1

@LasseKlüver:我的想法! – code4life

1

我認爲有幾種優雅的方式來做到這一點。既然你說你是一個初學者到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!"); 
    } 
} 
+0

更好地添加一個測試,該字符串的長度爲9,否則最終可能會驗證更長的字符串併爲較短的字符串獲取例外。 – juharr

+0

我故意留下了(注意'.Last()'),LOL。這個數字模式是我應該認識的嗎?我剛纔所說的問題完全可以解決,也許這是錯誤的? – code4life

+0

OP確實說了_並且最後一個字符是數字_但它似乎可能是第9個字符。即使這不是他們的意思,你仍然會在長度小於8的字符串上崩潰。 – juharr