2012-07-25 28 views
0

我在我的EF元數據使用RegularExpressionAttribute像這樣:RegularExpressionAttribute行爲與正則表達式不同或RegexStringValidator

[RegularExpression("[A-Z]+")] 
public string Code { get; set; } 

並正確不讓我進入比A-Z在場上的任何地方的任何其他。

在其他地方我想用同樣的reg表達式中的代碼,所以我轉過身來,正則表達式,像這樣:

var regex = new Regex("[A-Z]+"); 
Console.WriteLine(regex.IsMatch("B")); //true 
Console.WriteLine(regex.IsMatch("1")); //false 
Console.WriteLine(regex.IsMatch("A1")); //true - why? 

而且RegexStringValidator的工作方式相同的正則表達式。

我在做什麼錯?

回答

3
var regex = new Regex("[A-Z]+"); 
Console.WriteLine(regex.IsMatch("A1")); //true - why? 

該正則表達式表示,匹配一個或多個大寫拉丁字母。而「A1」包含一個大寫拉丁字母。

默認情況下,正則表達式匹配任何地方在字符串中。爲了匹配整個字符串開始的字符串錨的「^開始和一個字符串錨的「$結束而終止:

var regex = new Regex("^[A-Z]+$"); 
Console.WriteLine(regex.IsMatch("A1")); 

將顯示false

(有在.NET正則表達式一整套anchors。)

+0

+1的校正和完整的解釋。 – hometoast 2012-07-25 14:02:46

+0

謝謝,關於爲什麼我不需要在RegularExpressionAttribute中錨定表達式的任何想法? – weston 2012-07-25 14:07:53

+0

@weston [推測]因爲有了這個屬性,你幾乎肯定希望匹配整個事物,所以這是默認的一些機制(這是默認情況下做正確事情的屬性)。缺少默認的「匹配整個字符串」部分反映了正則表達式的歷史以及它們用於分割字符串和多個匹配的情況,這兩種匹配都不適用於字段驗證。 – Richard 2012-07-25 14:12:27

1

也許你想這樣的:

"^[A-Z]+$" 

"[A-Z]+"將匹配一個或多個字母來說,不論他們有串內什麼位置。

0

您必須錨定的正則表達式

"^[A-Z]$" 
相關問題