2014-01-09 52 views
2

我有下面的代碼片斷,我正在檢查無效字符的名稱,並在用戶輸入無效字符時返回false(允許的字符在正則表達式中定義) 。使用正則表達式檢查無效字符的輸入字符串

問題是:只要用戶在行尾輸入無效字符,但是如果用戶在ItemName之間輸入任何無效字符(即將光標移回到ItemName中間的某處)編寫無效字符,即返回false時應返回false。

我在定義正則表達式時犯了什麼錯誤?還是有其他的錯誤?謝謝

bool validName = true; 
Regex regex = new Regex(@"[a-zA-Z0-9_-]+$"); 
if (regex.IsMatch(ItemName, 0) == false) validName = false; 
if (!validName) 
{ 
    return false; 
} 
else 
{ 
    return true; 
} 

請讓我知道,如果有什麼不清楚。 (@「[a-zA-Z0-9 _-] + $」)改爲(@「^ [a-zA-Z0-9 _-] * $」)並且它可以工作。我正在做什麼明顯的錯誤,或者這是正確的解決方案?

+0

你的正則表達式看起來好像沒什麼問題.. –

+0

將'+'改成'*'也可以處理空字符串,並且在開始時追加'^'現在注意整個字符串對於這個模式是否有效。 – NeverHopeless

回答

3

你在你的正則表達式的開始需要一個錨"^[a-zA-Z0-9_-]+$")

你的正則表達式會遇到一個無效的字符,然後開始嘗試在下一個字符再次匹配(成功)。

你的工作實例正則表達式:

ItemName ="abc!def"; 
Regex regex = new Regex(@"[a-zA-Z0-9_-]+$"); // Not modified 
var result = Regex.IsMatch(ItemName, 0); 

首先,正則表達式將盡可能多的字符類儘可能的匹配,因爲+是貪婪:

*--- Start of match. 
"abc!def" 
    ^--- Regex engine matched up to here. 

你的模式的下一部分是$錨點或字符串結尾(在此上下文中)。這與'!'不符所以正則表達式開始嘗試在下一個字符再次匹配。

這又需要儘可能多的角色類地:

 *--- Start of match 
"abc!def" 
     ^--- Regex engine here. 

它再次檢查下一個字符是否是字符串的結尾(它是)。因此,發現匹配('def')並且IsMatch返回true。

通過將^(起始字符串)錨點添加到開頭,可以避免發生這種情況。

僅供參考,您的整個方法可以縮短爲:

Regex regex = new Regex(@"^[A-Z0-9_-]+$", RegexOptions.IgnoreCase); 
return regex.IsMatch(ItemName); 

編輯:

甚至只是:

return Regex.IsMatch(ItemName, @"^[A-Z0-9_-]+$", RegexOptions.IgnoreCase); 
1

變化,您正在使用,以

Regex regex = new Regex(@"[^.*?(?=[\^#%&$\*:<>\?/\{\|\}]).*$"); 

正則表達式,這將檢查無效字符在你的領域

+0

感謝您的幫助,但不知何故,我不得不列出有效字符,或者您可以說我不想列出無效字符。 – Vicky

相關問題