NET/ביטוי רגולרי

מתוך ויקיספר, אוסף הספרים והמדריכים החופשי
< NET
תכנות בסביבת NET








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

הקדמה[עריכה]

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

המחלקה המתייחסת לביטויים רגולריים בסביבת הדוט נט היא:

System.Text.RegularExpressions

דברים עיקריים שניתן לבצע באמצעות מחלקה זו:

  • לבדוק התאמה של מחרוזת לביטוי (פונקציית IsMatch),
  • לקבל את רשימת ההתאמות הנמצאות במחרוזת לביטוי (מחלקת Matches) לתוך משתנה אוסף MatchCollection. באמצעות שימוש במחלקה זו ניתן גם לקבל את מספרם (Count) של ההתאמות ואף את המיקום (Index) של כל אחת מההתאמות. (ראו דוגמה בהמשך).
  • לבצע חיתוך של מחרוזת לפי ההתאמות לביטוי (פונקציית Split) לתוך מערך מחרוזות,
  • לבצע החלפות בין תתי מחרוזות במחרוזת (פונקציית Replace), על פי ביטוי.

תוי בקרה בסיסיים[עריכה]

סימונים בסיסיים לתוי הדפוס של ביטויים רגולריים הם

  • אחת מאותיות האלף בית או המספרים - יחפש התאמה בכל מקום שהוא במחרוזת.
  • . - נקודה. משמש לחפש כל תו שהוא.
  • ^ - משמש לסמן את תחילתה של המחרוזת, באם הסימן לא יופיע החיפוש יתבצע בכל מקום עד תחילתה של המחרוזת.
  • $ - משמש בכדי לסמן את סופה של המחרוזת, באם סימן זה לא יופיע החיפוש יתבצע בכל מקום במחרוזת עד סופה.
  • [] מתאים לכל מה שמוגדר בסוגריים לתו אחד בלבד למשל
    • [a-z] - משמש לכל תו נמוך באלפבית האנגלי.
    • [א-ת] - משמש לכל תו באלפבית העברי.
    • [0-9] - משמש לכל הספרות, לדוגמה הביטוי [5-8] מציין כי התוכנה תחפש ספרות בין 5 ל8.
  • {} - משמש לסמן את מספר המופעים של תוי הביטוי שמבוקשים. לדוגמה {2}[A-Z] מציין שהתוכנה תחפש שתי אותיות גדולות. א{2,4} מציין שהתוכנה תחפש מחרוזות שמורכבות מהאות אלף בלבד בגדלים של שניים עד ארבע (אא, אאא, אאא).
  • * - משמש לציין מספר תוים לא מוגבל. למשל הביטוי הבא "^[0-9]*$" יבדוק האם כל המחרוזת היא ספרתית, מתחילתה ועד סופה.
  • בכדי לסמן כלל התוים להוציא חלק מהם יש לסמן זאת כך: [^a-d] - משמעות ביטוי זה הוא כל התוים להוציא את אלו שבין a ל d.
  • | - מפריד בכדי לסמן כמה ביטויים. (משמש כמו האופרטור OR) למשל אב|אגג|הדד יגרום לחפש את אחד משלושת המחרוזות הללו.
  • \ - משמש להתייחס לתו בקרה כאילו היה תו רגיל. אם למשל רוצים לחפש את התו $ יש לכתוב $\

ביטוי רגולרי קבוע[עריכה]

לחלק מהתוים יש ביטויים קבועים:

  • \d - מציין תו ספרתי מ0-9 = [0-9]
  • \w - מציין תו של אות או ספרה =[a-zA-Z0-9]
  • \s - מציין רווח כל שהוא = [\r\t\n\f]

אותיות גדולות מציינות את ההיפך.

  • \D - מציין כל תו שאינו מספרי = [0-9^]
  • \W - מציין כל תו שאינו אות או ספרה = [a-zA-Z0-9^]
  • \S - מציין כל תו שאינו רווח = [\r\t\n\f^]

Import[עריכה]

ראשית בכדי שהתוכנה תכיר את הספריה הנדרשת יש לייבא את המחלקה המתאימה.

בשפת VBscript יש לרשום:

Imports System.Text.RegularExpressions

בשפת C# יש לרשום:

using System.Text.RegularExpressions;

בשפת java יש לרשום:

 import java.util.regex

עבור ייבוא ביטוי רגולרי כללי.


דוגמאות[עריכה]

תפיסת החלפת שפת משתמש[עריכה]

לדוגמה בכדי שהתוכנה תשמיע ביפ, בכל פעם שהמשתמש מקליד אות אנגלית בתיבת הטקסט txtSearch ניתן לבצע זאת, באמצעות כתיבה של הקוד הבא באירוע txtSearch_TextChanged

  If Regex.IsMatch(txtSearch.Text, "[-a-zA-Z]") = True Then
     My.Computer.Audio.PlaySystemSound(Media.SystemSounds.Beep)
  End If


ספירת מספר ההתאמות וקבלת תחילת המיקום של ההתאמה השנייה[עריכה]

אם ברצוננו לחפש כמה מופעים של תת מחרוזת אחת יש בשנייה וכן את מיקומם המדוייק של תחילת המופעים ניתן לבצע זאת באופן הבא:

 Dim str As String = "ביום גשום הלכו ביחד אבא ובן"
 Dim pattern As String = "ב"
 Dim AllMatchs As MatchCollection = New Regex(pattern).Matches(str)
 Console.WriteLine(AllMatchs.Count & " " & AllMatchs.Item(1).Index)

התוצאה של קוד זה תהיה

4 15

הקוד : AllMatchs.Item(1).Index - נותן את ההתאמה השנייה מפני האיבר הראשון הוא 0.

איתור מילים עם אותיות בכל"מ[עריכה]

באמצעות ביטוי רגולרי ניתן לאתר מילים שלידן יש אות מסויימת, כך למשל אם רוצים לאתר מילה מסויימת, שמופיעה עם קידומת של אחת מאותיות בכל"ם, ולהדפיס אותה בחלונית "Output" ניתן לעשות זאת בצורה הבאה:

  Dim bachlam = "[בכלמ]"
  Dim str As String = "חתול תעלול נכנס לתוך הארון, וישב לו בתוך הארון."
  Dim substr As String = bachlam & "תוך"
  Dim AllMatchs As MatchCollection = _ 
          New Regex(substr, RegexOptions.None).Matches(str)
  For i As Integer = 0 To AllMatchs.Count - 1
      Console.WriteLine(AllMatchs(i).Value)
  Next

התוצאה של קוד זה תהיה

לתוך
בתוך


בדיקת תאריך[עריכה]

  Const IS_REG_ERUP_DATE = "^(0[1-9]|1[0-9]|2[0-9]|3[0-1])" + _
        "[./-](0[1-9]|1[0-2])" + _
        "[./-](\d{2}|\d{4})$"
  If Regex.IsMatch(TextBox1.Text, IS_REG_ERUP_DATE) = True Then
      MessageBox.Show("it is valid date")
  End If

ניתן לראות שכל חלק של התאריך מופרד לשורה נפרדת.

בשורה הראשונה (ימים), תו ה^ מציין שזו תחילת המחרוזת, לאחריה הביטוי מציין שהיא מקבלת את הספרות 0 1 ו2 יחד עם ספרה מ0 ועד 9, ואת הספרה 3 ביחד עם ספרה בין 0 ל1.
השורה השניה (חודשים) - מקבלת לוכסן מפריד, ולאחריה את הספרה 0 עם ספרה מ1 ועד 9 או הספרה 1 עם ספרה שבין 0 ל2.
השורה השלישית (שנים) - מקבלת לוכסן מפריד, ביחד עם שתי ספרות או ארבע ספרות. תו $ מציין שזו סוף המחרוזת.


הסרת תגיות HTML[עריכה]

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

  Public Function RemoveHtmlTag(ByVal Source As String) As String
  
  Return Regex.Replace(Source, "\<.*\>" , "", _ 
                              RegexOptions.IgnoreCase)
  End Function

התוצאה של פעולה זו תהיה הסרת כל המופעים של התגיות <....> מכל המחרוזת המקורית

פירוק משפט למילים[עריכה]

שימוש פשוט שאפשר לעשות עם פונקציית ה-Split הוא לפרק משפט (או מסמך שלם) למילים בתוך מערך מחרוזתי כאשר כל מילה "משוכנת" באיבר של המערך.

כך למשל אם רוצים שהתו המפריד יהיה רווח, וכל תת המחרוזות שבין הרווחים יפוצלו, יש לכתוב זאת בצורה הבאה:

Dim AllMatchs() As String = Regex.Split(substr, " ")

שיטת Regex.Split מחזירה מערך של כל המחרוזות שאותרו לתוך המערך AllMatchs.

כמובן שניתן לכתוב ביטויים רגולריים מתוחכמים יותר, שיעשו פיצולים "מעניינים" יותר.

קישורים חיצוניים[עריכה]