requlyar-ifadelerin-esaslari-–-1ci-hisse

Requlyar ifadələrin əsasları – 1ci hissə

               Hər hansı bir proqramlaşdırma dilini öyrənərkən bəzən həmin dilə “doğma olmayan” bir sıra mövzularla rastlaşırıq. Misalçün Java, PHP,C# və.s dilləri öyrənərkən verilənlər bazası bölməsinə çatdıqda bazayla işləyə bilmək üçün mütləq şəkildə sadə formada da olsa sorğular verməyi öyrənməliyik. Əks təqdirdə həmin bölməni tam mənimsəmək mümkün olmur.  Bazayla işləmək klaslar dilin özünə aid olsa da konsepsiya dilin sərhədləri kənarında qalır.

               Müasir proqramlaşdırma dillərinə daxil olan, amma “onlardan olmayan” mövzularımızdan biri də requlyar ifadələrdir.

PS: Bu məqaləmiz hansısa bir proqramlaşdırma dilinə aid olmayacaq. Adətən brain2brain.net saytında biz .NET və JS texnologiyaları üzrə məqalələr paylaşırıq. Bu məqaləmiz digərlərindən fərqli olaraq, daha geniş proqramçı kütləsi üçün nəzərdə tutulub. Məqalədən PHP, Java,JS, .NET, Python, ümumiyyətlə öyrəndiyi və istifadə etdiyi dildə requlyar ifadələri başa düşmək istəyən bütün proqramçılar  rahatlıqla istifadə edə bilərlər.

               Requlyar ifadələr nə işə yarayır?

Requlyar ifadələr mətndə hər hansı bir və ya bir neçə eyni və bənzəri söz və ifadələri tapmaq və əvəzləmək üçün nəzərdə tutulub.

 Sadə formada belə deyə bilərik ki, əgər əlinizdə böyük bir mətn varsa, orda hansısa bir ifadəni və ya sözü tapmaq, əvəzləmək istəyirsinizsə ozaman requlyar ifadələri istifadə edə bilərsiniz.

 Stringin axtarış metodları ilə Requlyar ifadələr arasında fərq nədir?

               Hər birimizin öyrəndiyi proqramlaşdırma dilində mütləqki string klasının axtarış metodları var. Requlyar ifadələri ilk dəfə öyrənən zaman belə bir təbii sual ortaya çıxır: Requlyar ifadələrlə string axtarış metodları arasındakı fərq nədir? String axtarış metodları belə desək çox primitiv axtarış imkanına malikdirdir. Siz sadəcə dəqiq göstərdiyiniz ifadə və sözləri tapa bilirsiniz. String metodları bu baxımdan çox primitivdir. Bizə isə əksər hallarda “daha ağıllı” axtarış və əvəzləmə imkanı lazım olur.Misalçün:

1)Mətndə 050 və 055 ilə başlayan və sonu 13 ilə bitən nömrələri tap.

2)Mətndə olan istənilməyən(təhqiredici) sözləri *** ilə əvəzlə

3)verilən ifadənin düzgün email olduğunu yoxla.

4)verilən ifadənin düzgün telefon nömrəsi, poçt kodu,İP adres,youtube video linki, düzgün url adresi vəs.  olduğunu yoxla.

               Yuxarıda sadaladığımız situasiyaları emal etmək üçün reqular ifadələr ən yaxşı variantdır.

PS: Məqalə boyu yazacağımız reqular ifadələri regex101.com saytında test edə bilərsiniz.

Requlyar ifadələr praktikada sizə hansı hallarda lazım ola bilər?

PS: Müəllif bu bölmədə öz praktikasında qarşısına çıxan halların bəzilərinə yer verib.

1)Veb səhifələr hazırlayan zaman bir sıra hallarda bəzi inputlarin doğruluğunu ən düzgün formada requlyar ifadələrlə veririk.

2)Beynəlxalq Microsoft sertifikatına hazırlaşan zaman HTML üzrə düşn sual

3)Beynəlxalq Microsoft sertifikatına hazırlaşan zaman JS üzrə düşən sual

4)C# dilində aspx faylını emal edən zaman

class Program
{
    static void Main()
    {
        // First we see the input string.
        string input = "/content/alternate-1.aspx";

        // Here we call Regex.Match.
        Match match = Regex.Match(input, @"content/([A-Za-z0-9\-]+)\.aspx$",
            RegexOptions.IgnoreCase);

        // Here we check the Match instance.
        if (match.Success)
        {
            // Finally, we get the Group value and display it.
            string key = match.Groups[1].Value;
            Console.WriteLine(key);
        }
    }
}

5)Emanatda bəzi provayderlərdə istifadəçilərin daxil etdiyi informasiyalara limit qoyan zaman

"__objects": [
                        {
                            "header": "Xahiş edirik, telefon nömrənizi daxil edin.",
                            "footer": "",  
                            "mask": "",
                            "name": "account",
                            "nobr": "false",
                            "regexp": "^\\d{9}$",
                            "strip": "True",
                            "type": "text_input"
                        }
                ]

Bir müddət regex yazdıqdan sonra..

 

6)Web API validasiyası zamanı

public class RegisterBindingModel
{
    //...

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [RegularExpression(@"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]*$",
     ErrorMessage = "The password should have upercase letter, lowercase letters and digits.")]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    //...
}

7)Hər hansı bir texnologiyaya parse edən zaman(misalçün HTML parse)

internal class Data
{
    public string Name { get; set; }
    public string Composition { get; set; }
    public float Price { get; set; }
}


private static ICollection ParseHtmlInput(string htmlInputText)
{
    List result = new List();
    Regex regex = new Regex(@"
  • (.+?)\s*?\((.*?)\)\s*?(\d+|\d+.\d+));     Match match = regex.Match(htmlInputText);     while (match.Success)     {         var name = match.Groups[1].Value;         var composition = match.Groups[2].Value;         var price = match.Groups[3].Value;         var priceAsFloat = 0f;         float.TryParse(price, out priceAsFloat);         result.Add(new Data { Name = name, Composition = composition, Price = priceAsFloat });         match = match.NextMatch();     }     return result; }
  •  

    Requlyar ifadələri öyrənməyə başlayırıq:

    1)     Yazdığımız istənilən bir soz  ən sadə formada bir requlyar ifadədir.

    2)     Adətən requlyar ifadələr bizə ilk tapdığı informasiyanı qaytarir. Lakin əksər hallarda bütün mətn boyu requlyar ifadəyə düz gələn bütün məlumatların tapılması lazım olur. Bu g (global) modifikatoru yazmaqla alınır.

    3)     Adətən requlyar ifadə registrə hessasdır. Amma bir çox vaxt məlumatın registrə həssas olmadan axtarılması lazım olur .Registre həssasligi i modifikatoru ile veririk.

    4)     Requlyar ifadələrdə istənilən növ məlumatı axtarmaq üçün nöqtə(.) simvolundan istifadə olunur.

    5)     Axtardığımız istənilən bir simvolu yox, sadəcə nöqtənin özünü tapmaq üçün isə \. əmri verilir.

    6)     Nöqtə işarəsini requlyar ifadədə vermək heç də həmişə yaxşı variant deyil. Çox hallarda bütün simvollar yox, konkret bir neçə simvol lazım olur. Bu zaman [] işarəsindən istifadə olunur.

    7)     Müəyyən aralıq vermək üçün - işarəsindən istifadə olunur. Misalçün: Əgər hər hansı bir nömrə axtarırıqsa, nömrənin tərkibində 567,667 və ya 767 olduğunu müəyyən etmək üçün [5-7]67 requlyar ifadəsi yazırıq. Həmçinin [a-z0-9A-X]uriki   ifadəsi bildirirki ,requlyar ifadə 0uriki,Aruki,aruki,zuriki ifadələri tapacaq, amma @uriki,Zuriki kimi ifadələri götürməyəcək!  Burada [] işarəsi ,həmin işarəyə daxil olan hər hansı  1 simvol anlamına gəlir!


    8)     [^0-9] ->nə olur olsun, bircə 0-9 arası rəqəm olmasın!!  ^ işarəsi İNKAR deməkdir!!


    9)Müəyyən qrup elementləri tapmaq üçün Meta Simvollardan istifadə olunur. Meta simvol spesifik əhəmiyyəti olan simvoldur. Herşeyə uygun gələn nöqtə,kvadrat mötərizə ve onun içərisindeki defis işarəsi, hamısı metosimvoldur.Metasimvol əslində real simvollara duz gələn,amma basqa menani ifade eden simvollardir.Metasimvolları onlarin original menalarini ifade eden simvollardan fərqləndirmək ucun \ isaresi istifade olunur. Misalcun [] vs \[]

    \t ->tabları tapmaq

    \n ->Yeni sətrə keçidi tapmaq

    \f ->yeni sehifeye kecidi tapmaq

    \r ->carry return CR

    \d ->decimal(rəqəmlər) tapilmasi prosesi. Reqemlerin metasimvolu

    \D ->Rəqəm olmayanlarin tapilmasi. Rəqəm olmayanlarin metasimvolu

    \w ->bu əslində [a-zA-Z0-9_] simvollari toplusu deməkdir.

    \W ->bu əslində [^a-zA-Z0-9_] demekdir

    \s -> Bütün probel simvolları deməkdir

    \S -> Bütün probel simvollarından  başqa hərsey deməkdir.

     

    10) Requlyar ifadədə simvollari 16lıq say sistemində də tapa bilərik. Misalcun tural sozunu tapmaqcun \x54\x75\x72\x61\x6c yaziriq.burada \x 16 say sistemində axtaran simvoldur.

     

    11)Axtardığımız simvol və ya simvol toplusunun optinal(məcburi olmayan) olduğunu və ya 1 ədəd olduğunu göstərmək üçün ? işarəsindən istifadə olunur.

    12) Axtardığımız simvolun ard-arda verilən sayda olduğunu göstərmək üçün {} işarəsindən istifadə olunur. Misalçün: ard-arda 3 ədəd 8 rəqəminin gəldiyini göstərmək üçün 8{3} yazılır.

    Ard-Arda 5 rəqəmin gəldiyini göstərmək üçün \d{5} və ya [0-9]{5} yazmaq olar.

     

    13)Axtardığımız bəzi simvollar requlyar ifadələr tərəfindən rezervləşdirilib. Ona görə onları istifadə edərkən diqqətli olmaq lazımdır. Misalçün . ? { [ və.s simvollar.

     

     

    Öyrəndiklərimizi praktika edək.

     

    Öyrəndiklərimizə görə verilən mətnimizdə telefon nömrələrini tapmağa çalışaq. Gördüyümüz kimi, bütün telefon nömrələri quruluşuna görə bir birindən fərqlənir. Tapşırığı yerinə yetirək.

     

    Ilk baxışdan requlyar ifadəmiz çətin görünsə də, onu hissələrə parçaladıqda asanlıqla başa düşə bilərik.

     

    Yadda saxlayın ki, requlyar ifadələrdə təkcə məqsəd axtardığını tapmaq deyil, həmçinin axtarmadığını tapmamaqdır. Requlyar ifadələri mümkün qədər spesifik yazmaq lazımdır ki, kənar bizə lazım olmayan informasiyaları tapmasın. Requlyar ifadələr yazmaq çox asandır, sadəcə bizə lazım olan məlumatları emal edən requlyar ifadələri yazmaq isə çox çətindir.

                   Məqalənin ikinci hissəsində requlyar ifadələrlə bağlı qalan digər idarəedici əmrləri nəzərdən keçirəcəyik.

     

     

    Tural

    Tural Süleymani

    Süleymani Tural Microsoft-un MCSD statuslu mütəxəssisidir, 2008-ci ildən bu yana proqramlaşdırma üzrə tədris aparır

    Müəllifin bu dildə ən son postları

    Bu yazıları da bəyənə bilərsiniz