2017-01-10 42 views
0

這應該是一個相當簡單的問題,但我似乎正在推翻它。Regex.IsMatch問題

我有一個輸入,我需要確保沒有任何字符不是ASCII printable characters (character code 32-127)

string someString = "6244ABº¿º"; 
var regexPattern = new Regex("^$|[ -~]*"); 

if (regexPattern.IsMatch(someString)) 
{ 
    //invalid format 
} 

這裏是什麼,我想作爲輸入和輸出一個想法:

Input: [email protected]#%[email protected]% Ouput: Valid (All are within ASCII 32-127) 
Input: º¿º234234  Ouput: Invalid (Has 'º' and '¿') 
Input: AAABCC  Ouput: Valid 

編輯:我認爲這是倒退的正則表達式。它與'*'有關係嗎?

+0

你想要一個空字符串被認爲是無效的嗎? – juharr

+0

你認爲ASCII 127無效嗎?或者代碼的確如此,但你的描述沒有。 – CodesInChaos

+0

您可以否定正則表達式的含義(因此,如果輸入有效,則匹配),並使用'^ [ - 〜] * $'' – CodesInChaos

回答

4

我只是迭代你的字符串的字符,並檢查是否有超出你想要的範圍。像

private bool IsPrintable(string someString) 
{ 
    foreach(var c in someString) 
    { 
     if((int)c < 32 || (int)c > 127) 
      return false; 
    } 
    return true; 
} 
+0

那些投入int是毫無意義的。 – CodesInChaos

+2

更簡單但速度更慢的版本將是'!s.Any(c => c < 32 || c > 127)'或's.All(c => c> = 32 && c <= 127)'' – CodesInChaos

+0

謝謝!這似乎有竅門!我在if語句的末尾遇到了一些你的代碼的語法問題(一個額外的')'。 – ferensilver

1

請嘗試以下方法:

string someString = "6244ABº¿º"; 
var regexPattern = new Regex("^$|[^ -~]"); 

if (regexPattern.IsMatch(someString)) 
{ 
    //invalid format 
} 

我加^否定字符範圍-~,使範圍之外的任何字符將匹配的表達。我也刪除了*,因爲它沒有必要(只有一個不可打印的字符就足以使字符串無效)。

+4

你應該添加一個解釋你改變了什麼以及爲什麼。 – CodesInChaos

0

Mats391東西是你的問題直截了當的答案,如果您只想從32到127的範圍內。然而,如果你只是想確保沒有控制字符只存在(如果你想包括例如Unicode字符),那麼這可能是你正在尋找的。

string someString = "6244ABº¿º"; 
bool isValid = someString.All(i => !Char.IsControl(i));