2015-04-06 62 views
2

我想驗證字符串字段以確保每個字符串的第一個字母是大寫。使用正則表達式驗證字符串是否正確使用

例如:

"My Name Is Jaas" - This is valid 
"My name is Jaas" - Is Invalid because 'name' and 'is' start with lower-case letter. 

我想驗證此使用正則表達式中的C#。什麼是正確的正則表達式?

+0

如果您明確說明「單詞」是什麼,這將會很有幫助。例如,「每個子字符串的第一個字符,如果它是一個字母是大寫字母,並且子字符串之間用空格分隔」。 – Les

回答

2

看起來你不需要任何正則表達式。使用LINQ .Split().All(p => p.Substring(0, 1) == p.Substring(0, 1).ToUpper())檢查是否所有單詞都用大寫字母的第一個字符(不要忘了添加System.LinqSystem.Xml.Linq using語句):

var tst = "My Name Is Jaas"; 
var ntst = "My name is Jaas"; 
var pass = tst.Split().All(p => p.Substring(0, 1) == p.Substring(0, 1).ToUpper()); 
var fail = ntst.Split().All(p => p.Substring(0, 1) == p.Substring(0, 1).ToUpper()); 

輸出:

pass = true 
fail = false 

如果你堅持一個正則表達式,您可以使用以下內容:

var rxTitleCase = new Regex(@"^(\p{Lu}\p{L}*\s*)+$"); 
var tstSuccess = rxTitleCase.IsMatch(tst); 
var tstFail = rxTitleCase.IsMatch(ntst); 

輸出與上面相同。

+0

你有我的投票給正則表達式字符串。謝謝 –

3

所以我不會強加這個約束作爲每個說法的「驗證」,而是做一個簡單的轉換。你的用戶會感謝你。

另外,雖然我是正則表達式的忠實粉絲,但這是一種情況,我認爲如果沒有它,情況會更好。

您可以使用以下方法:

TextInfo textInfo = new CultureInfo("en-US",false).TextInfo; 
string formatted = textInfo.ToTitleCase("yOur STRING hErE"); 

如果你仍然堅持使用驗證你可以比較前後格式化值。

PS:你需要這個命名空間using System.Globalization;

+0

是的,如果你可以避免驗證,這顯然是要走的路。 –

0

如果您確定輸入總是用一個空格分隔,可以在每個空間分割輸入和檢查每個單詞的第一個字母是大寫的與char.IsUpper

.Split().All(w => char.IsUpper(w[0])); 

因此,例如:

var correct = "My Name Is Jaas"; 
var incorrect = "My name is Jaas"; 

bool willbeTrue = correct.Split().All(w => char.IsUpper(w[0])); 
bool willBeFalse = incorrect.Split().All(w => char.IsUpper(w[0])); 

如果它可以包含多個空格,您可以刪除先佔Ÿ項與此String.Split超載:

.Split(new[]{' '}, StringSplitOptions.RemoveEmptyEntries).All(w => char.IsUpper(w[0])); 
0

這Rexex應您的要求工作...

 var pattern = @"^([\S-[a-z]]\S*\s*)+$"; 
     var test = "My Name Is Jaas"; 
     var test2 = "My name is Jaas"; 
     var test3 = "My Name Is Jaas The 3rd"; 

     var rx = new Regex(pattern); 
     var t1 = rx.IsMatch(test); 
     var t2 = rx.IsMatch(test2); 
     var t3 = rx.IsMatch(test3); 

模式[\ S- [AZ]是指任何非空白字符除了小寫字母。我這樣做是因爲你說你想要正確大小寫,而且我不能確定你的子字符串是否可能以非字母字符開頭。你的例子很簡單,但如果你的實際數據變得更加複雜,我將它作爲一個開始的地方。

順便說一句,它是非常類似於stribizhev的正則表達式。