Regex nedir? Regex'in temellerine bir bakış!

7 gün önce , Okuma süresi 4 dakika.

İhtiyacımız olduğunda karşımıza bazen çıkan Regex, önemşi miktarlarda veri işlemediğimiz sürece aslında muhtemelen kullanmayacağımız bir uygulamadır.
Regex nedir? Regex'in temellerine bir bakış!

Regex, yalnızca ihtiyacınız olduğunda öğrendiğiniz şeydir. Önemli miktarda veri işlemediğiniz sürece, muhtemelen kullanmayacaksınız. Bu, bir yazılım mühendisi olarak bunu unutup zamanı geldiğinde endişelenmemiz gerektiği anlamına mı geliyor? Bunu öğrenmek için sorumluluk almamalı mıyız?

Programcılar Regex'in zor olduğunu düşünüyor. Her beceride olduğu gibi, ustalaşmak için pratik gerektirir. Size yardımcı olmak için, bu makaleyi Regex'in temellerini anlatmak ve onu nasıl kullanabileceğinize dair basit bir uygulama göstermek için yazdım.

Regex'i öğrenmek için nedenler

Çözmeye çalıştığımız soruna Regex kalıbı hakkında googling, belirsizlik içinde sıkışmış. Bu tanıdık geliyor mu? Bahse girerim en az biriniz daha önce benzer bir durumdaydı. Ancak, Regex'in giriş ve çıkışlarını bilmenin daha kolay olacağını düşünmüyor musunuz? Gerçekten de bu, cevap arama süresini kısaltabilirdi.

Regex, bir tür ayrıştırma gerektiren sorunları çözmek için daha kısa bir yol sağlar. Bir örnek, bölme işlevidir. Bir tür mantık uygulamadan önce dizenizi belirteçlere dönüştürmek, yerine koymak için uzundur. Bu uygulamanın Regex kullanımına kıyasla sınırlı olduğu dönemler.

Umarım, bir sonraki bölüm, Regex'in daha fazlasını ele alacağımız için sizi heyecanlandırır.

Normal İfadeyi Anlayın

Regex, düzenleme ifadesi olarak da adlandırılır. Aradığınız veri kalıpları için bir ifade tanımlayan bir dizi karakter dizisidir. 1980'lerden beri uzun süredir oradaydı ve birincil kullanımı dizeleri aramak ve ayrıştırmaktı.

Olabilen bir ".com" alan adını sahip e-posta adresi arayan için Regex bir örnek: /[email protected]/.

Şimdi mantıklı gelmiyorsa endişelenme. Bir sonraki bölümde yukarıdaki ifadedeki karakterlerin ne anlama geldiğini ele alacağım.

Normal ifade yapısı ve özel karakterler Bilinmesi gereken ilk şey, bir Normal ifade kalıbını tanımlamanın iki yolu olduğudur: Normal bir dize değişmezi kullanma

var pattern = /abc/

Calling RegExp

var pattern = new RegExp('abc')

Hangisi ne zaman kullanılır? Düzenli dize değişmezi, kalıbı önceden bildiğiniz zamandır. Bunun tersine, çalışma zamanı sırasında dinamik verileri kullandığınızda RegExp yapıcısı.

Regex'teki özel karakterler, daha karmaşık Regex kalıbı oluşturma yeteneğini genişletir. Bazı temel olanlara bakalım.

"Kimden: [email protected]" dizesi aşağıdaki senaryoların her birinde kullanılacaktır. Ve Regex modelinin sonucunu vermek için bir ok kullanılacaktır. Ancak bu hiçbir şekilde JavaScript kullanılarak çalışmayacaktır.

^ - Düzeltme işareti simgesi bir dizenin başlangıcıyla eşleşir

var re = /^ From: / => From:

$ - Dolar işareti simgesi bir dizenin sonuyla eşleşir

var re = /net$/ => net

. - Nokta karakteri herhangi bir tek karakterle eşleşir

var re = /[email protected]/ => [email protected] // Any single character and @ sign

[0-9]- Karakter seti. Köşeli parantez içindeki herhangi bir karakterle eşleşir.

var re = /[0-9]/ => 1 and 8, not to be confused by 18

* - Yıldız işareti karakteri kendinden önceki herhangi bir karakterle eşleşir, en az bir, yani sıfır veya bir.

var re = /.*:/ => From: // Any multiple of character until semi column

+ - Artı işareti karakteri kendinden önceki herhangi bir karakterle bir veya daha fazla kez eşleşir.

var re = /@[a-z]+/ => yazilim // Start at @ sign, include any multiple of lowercase characters

Son olarak, yıldız işaretleri, artı işareti ve nokta gibi karakterler, Regex'teki özel karakterlerdir. Ya bunları normal Regex ifadenizde kullanmak isterseniz. Neyse ki kalıbınızda özel karakterler kullanmanın bir yolu var, onlardan kaçmanız gerekir. Önlerine eklemek (bölü işareti) anlamına gelir, böylece artık özel karakterler olarak değil, normal karakter olarak kabul edilirler.

var re = /..*/ => .net// Start at the period character, include any characters afterwards

Artık bir normal ifade oluşturmanın çeşitli yollarını ele aldığımıza göre, devam edip bunu JavaScript ile birleştirelim. Bu, çıkarma, değiştirme ve benzeri gibi daha karmaşık işlemleri gerçekleştirmemize izin verecektir.

Regex ve JavaScript Kullanarak Örnekleyelim

Bu bölümde, bir dizge üzerinde bir ayıklama gerçekleştirmek için Regex'in JavaScript ile birlikte nasıl kullanılacağını anlatacağım. Bunun için, yinelenen klasör adlarının oluşturulmasına izin veren bir dosya simülatörü uygulayacağım.

Bu nedenle, yinelenen klasör adından kaçınmak için, yeni klasörün adını benzersiz kılmak için klasör adına bir dize eklememiz gerekir. Bunun için, klasörün çoğaltılma sayısını temsil etmek için parantez içine alınmış bir dizin ekleyecektir.

Normal ifadeyi oluşturmaya başlamadan önce, ele alınacak çeşitli senaryoları parçalara ayırmaya başlayalım: Herhangi bir karakter içeren bir klasörün adı, örneğin, python Herhangi bir karakter ve parantez içinde bir rakam içeren klasörün adı, örneğin python (0)

İlk olarak, çoğaltılmış klasörün adını herhangi bir karakterle almamız gerekir.

var regex = /.+/

Ardından bir numara ile birlikte verilen desteği arayın.

var regex2 = /([0-9]+)/

Slash kullanarak sayıyı çevreleyen iki parantezden kaçtığımızı fark edeceksiniz. Kapalı parantezin ortasında, bir sayıyı tanımlamak için sıfırdan dokuza kadar bir karakter kümesi kullandık. Birden fazla sayıya ihtiyacımız olduğundan, iki veya daha fazla basamaklı sayıları karşılamak için artı işaretini ekledik.

İki farklı Regex ifadesini tek bir dizede kullanmak gereksiz değil mi? Ya bunu tek satırda yapabilseydik? Bunu yapmak için, hem klasörün adını hem de numarayı etraflarındaki süslü parantezleri kullanarak çıkarabiliriz.

Son ifade şöyle görünecek:

var regex = /(.+) (([0-9]+))/

Regex ifadesini çalıştırmak için, yukarıdaki ifadeyi argüman olarak kullanarak match işlevini çağırın.

var name = 'Folder (0)'
var matchFound = name.match(regex) => ['Folder (0)', 'Folder ', '0']

Eşleşme işlevinin yukarıdaki sonucu, değer bulunmazsa veya değerler çıkarılırsa boş döndürür. Daha fazla ayrıntı için match() işlevi referansını kontrol edin .

Not: Dizinin ilk değeri, geçirdiğiniz dize olacaktır ve geri kalanı, çıkarılan değerlerdir.

Bir sonraki bölümü tamamlamanız için bırakıyorum, böylece getDuplicateName işlevi klasörün adını ve bir kopya ise klasörün sonundaki dizini döndürür.

function getDuplicateName(list, name) {
            var regex = /(.+) (([0-9]+))/  
            var matchFound = name.match(regex) ?? []

            var [, baseName, index] = matchFound;

            var isDone = (matchFound.length > 0) ? !(!!baseName) : !list.includes(name) 
            var count = index ? Number(index) + 1 : 0
            var newName = name
            baseName = baseName ?? name

            while (!isDone) {
                newName = `${baseName} (${count})` 
                if (!list.includes(newName)) {
                    isDone = true
                    continue
                }
                count++
            }

            return newName
        }

Kaynaklar

Tam kaynak koduna bakmak istiyorsanız GitHub deposunu veya dosya simülatörünün demosunu ziyaret edin .

 

#javascript