November 5, 2010

如何驗証GUID格式是否有效

GUID很常用, 尤其是拿來當primary key,我們很常用GUID來取得DB中相對應的資料。在大部份的情況下我們不會讓使用者輸入GUID來取得對應資料。

預設在.NET中以System.Guid.NewGuid()可以產生一長度為36的GUID字串,就像在SQL Server中將預設值設為newid()產出的GUID字串一樣,如a7c1e7ea-9e6b-4067-9278-0a1f78bbbb44
剛好手邊的案子就需要使用者輸入GUID來跟系統做認證授權並取得資料,使用者輸入的GUID長度或格式若有誤,頂多找不到資料,但因字串長,比對格式或長度有沒有錯眼力不夠好可能也得花些時間所以就會希望有個防呆機制,驗証GUID格式是否符合預期,並適時回應給使用者。

一個quick-and-dirty的解法,就是用try-catch方式,將使用者輸入的GUID字串帶入System.Guid的建構式中,若Guid類別無法被初始化,就會丟出exception並被catch到,如下code snippet
public bool IsGuidValid(string inputGuid)
        {
            try
            {
                Guid guid = new Guid(inputGuid);
                return true;
            }
            catch
            {
                return false;
            }
        }
這是最快的方式,卻也濫用了try-catch

比較好的做法是使用Regular Expression去檢查GUID的格式,如下
public static bool IsGuidValid(string inputGuid)
        {
            string pattern = @"^[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}$";
            return Regex.IsMatch(inputGuid, pattern);
        }
而在.NET 4.0中,提供了新的Guid.TryParseGuid.TryParseExact方法讓我們可以判斷GUID是否有效,可以簡化上述的兩個做法

No comments: