262. Checking if a string is a valid Guid

לפעמים אנחנו מקבלים מחרוזת ומעוניינים לוודא שהיא מהווה Guid תקין.

הדרך הכי פשוטה לעשות זאת היא באמצעות תפיסת Exception:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private static bool TryParse(string value, out Guid result)
{
try
{
result = new Guid(value);
}
catch (FormatException)
{
result = Guid.Empty;
return false;
}
return true;
}

אלא שזה די דוחה לתפוס Exception כדי לבדוק האם יצירת הGuid הצליחה או לא.

היינו מעדיפים לוודא לפני הפרסור האם מדובר הפרסור הולך להצליח או לא…

אז ננסה:

ניצור איזה Regex שבודק האם Guid הוא תקין או לא:

הRegex נראה כמו משהו כזה:

^(\{{0,1}([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}\}{0,1})$

[מבוסס על הPattern מכאן]

אז נבדוק:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private static readonly Regex mGuidRegex =
new Regex
(@"^(\{{0,1}([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}\}{0,1})$",
RegexOptions.Compiled);
private static bool TryParse(string value, out Guid result)
{
if (mGuidRegex.IsMatch(value))
{
result = new Guid(value);
return true;
}
else
{
result = Guid.Empty;
return false;
}
}

שימו לב שהRegex הזה סבבה והכל, אבל לא מתאים לכל הFormatים החוקיים של Guidים.

אפשר לנסות לשפר את הRegex, אבל נשים לב שככל שננסה לשפר אותו יותר, כך וואלידאציה עליו תהיה יותר כבדה…

בסופו של דבר, אם אנחנו יודעים שהGuidים שאנחנו מצפים לקבל הם בפורמט ספציפי, נוכל לכתוב Regex מתאים לו ולחסוך את תפיסת הException. במידה ולא נוכל לאפיין את כל הGuidים שאנחנו מצפים לקבל, כנראה הפתרון הכי טוב הוא להשתמש בtry-catch, מאחר והוואלידאציה תעלה לנו לא פחות מתפיסת הException מבחינת ביצועים…

המשך יום כמעט חח"ע טוב.

שתף