החלפה של תבנית טקסט במחרוזת באמצעות Regex

לפעמים נרצה לעבור על טקסט ולהחליף חלקים ממנו שיש להם תבנית מסויימת.

למשל, במשימה שלי, הייתי צריך לקבל מקטע טקסט (אין חשיבות לאורכו) ולהחליף את כל מה שמופיע בתוך סוגריים מסולסלות בערכים אחרים. הבעיה העיקרית במקרה זה היא לאתר את כל מקטעי הטקסט שמופיעים בתוך סוגריים מסולסלים, למרות שהתוכן שנמצא בתוך הסוגריים הוא שונה, כך ששימוש פשוט ב string.Replace לא יכול לעבוד פה.

בפוסט זה אציג את הפתרון שלי לבעיה זו ב-C#, תוך כדי שימוש ב Regex.

* TLTR; (לא רוצים לקרוא את כל ההסברים? ניתן לגשת ישר לסיכום)

 

נניח שהמשתנה שמכיל את הטקסט שלנו נקרא myText:

string myText = "Hi {FirstName} {LastName}. Your username is {UserName}";

 

בשלב הראשון נרצה להגדיר מה בעצם אנחנו מחפשים (במקרה שלנו מדובר על תוכן שבתוך סוגריים מסולסלים). את ההגדרה לכך נעשה באמצעות Regex (התבנית שבה נשתמש היא "{.*?}"):

 

Regex regex = new Regex("{.*?}");

 

בשלב הבא נחפש בתוך הטקסט שלנו (myText) את החלקים בתוכו שמתאימים לתבנית שהגדרנו ב-Regex. את כל החלקים המתאימים הוא ישמור לתוך המשתנה matches ולאחר הרצת השורה הבאה הוא יכיל 3 טקסטים ({FirstName},  {LastName} ו-{UserName}).

MatchCollection matches = regex.Matches(myText);

 

כעת, מה שנותר לנו לעשות זה להחליף את הטקסטים שמצאנו בטקסט שאנחנו רוצים במקום כל אחד מהם. נעשה את זה באמצעות לולאת foreach, ונחליף כל אחד מהערכים שמצאנו בטקסט שנרצה (הערך שיהיה ב NEW_VALUE).

foreach (Match match in matches)
{
	myText = myText.Replace(match.Value, NEW_VALUE);
}

 

לסיכום (TLTR;)

אם נאחד את כל הקוד למקטע אחד נקבל את הקוד הבא:

string myText = "Hi {FirstName} {LastName}. Your username is {UserName}";
Regex regex = new Regex("{.*?}");
MatchCollection matches = regex.Matches(myText);
foreach (Match match in matches)
{
	myText = myText.Replace(match.Value, NEW_VALUE);
}

 

כמובן שניתן להחליף את התבנית של ה- Regex בכל דבר אחר, למשל טקסט שבתוך סוגריים מרובעים, שמתחיל בנקודה ונגמר בסימן קריאה או אפילו לפי מספרי טלפון. השימוש ב- Regex מאפשר לנו גמישות מירבית ולכן מומלץ להשתמש בו.

 

 

מדריך זה עזר לכם? יש לכם דרך יותר יעילה? יש לכם שאלות נוספות על המדריך או חלקים שלא הבנתם? תרשמו לי בתגובות!

תגיות:

הוסף תגובה