Bloga dön

Yayın tarihi · 7 dk okuma

Developer Olmayanlar İçin Regex: Pratik Rehber

Yazarlar, analistler, pazarlamacılar ve Bul-Değiştir kutusunda yaşayan herkes için sade bir regex rehberi. İşe yarayan söz dizimini öğrenin, on hazır tarifi kopyalayıp kullanın.

Developer değilsen regex neden işine yarar?

Word'de, Google Docs'ta, Notion'da, bir tabloda ya da sevdiğin metin editöründe Bul-Değiştir kutusunu açıp "bunu yapmanın daha hızlı bir yolu olmalı" dediysen bu yazı tam sana göre. Regex, yani regular expression, küçücük bir desen dili. Bul-Değiştir'i künt bir alet olmaktan çıkarıp neşter haline getiriyor. Tek bir sabit kelime aramak yerine aradığın şeyin biçimini tarif ediyorsun: "herhangi bir telefon numarası", "tarihle başlayan her satır", "bu dağınık dışa aktarmadaki tüm e-posta adresleri".

Regex'in korkutucu bir ünü var çünkü programcılara yazılmış öğreticiler ilk paragrafta yirmi sembolü birden başına yağdırıyor. Oysa gerçek şu: yaklaşık on karakter ve bir avuç desenle inanılmaz üretken olabilirsin. Bu yazı önce o çekirdeği gösterecek, sonra bugün hemen herhangi bir modern uygulamanın Bul-Değiştir kutusuna yapıştırabileceğin on tarif verecek.

Regex nerede çalışıyor diye merak ediyorsan: Microsoft Word ("Joker karakter kullan" seçeneğiyle ya da yeni regex aramasıyla), Google Docs ("Düzenli ifadeler kullanarak eşleştir"), VS Code, Sublime Text, Obsidian, BBEdit, REGEXMATCH ve REGEXREPLACE üzerinden Google Sheets, Power Query veya yeni REGEX fonksiyonları üzerinden Excel ve neredeyse her kod editörü desteğiyle. Bazı uygulamalar küçük lehçe farkları kullanıyor ama burada öğreneceklerinin yüzde doksanı her yerde çalışıyor.

Regex nedir, kısaca?

Regular expression aslında bir desendir. Bu deseni arama motoruna verirsin, motor da metnin içinde desene uyan her parçayı geri döndürür. En basit regex bir sözcüktür: kedi deseni k, e, d, i harflerini sırayla bulur. Buraya kadar her şey sıradan Bul-Değiştir, doğru.

Sihir, metakarakter denilen özel karakterler işin içine girince başlıyor. Bu karakterler kendilerini değil, kategorileri ya da kuralları temsil ediyor. Örneğin nokta "herhangi bir tek karakter" anlamına geliyor. k.di deseni artık kedi'yi, kadı'yı, k7di'yi, hatta k#di'yi yakalıyor. Bir tek desen düzinelerce aramanın işini görüyor.

Zihinsel modelin tamamı bu. Regex aslında metin gibi yazılan bir dize, ama içindeki bazı karakterler daha genel anlamlar taşıyacak şekilde "yükseltiliyor". Bu yükseltilmiş karakterleri öğrendiğinde önüne çıkan hemen her deseni okuyabilir, yenisini yazabilirsin.

Ezberlemeye değer yapı taşları

  • . (nokta) yeni satır dışında herhangi bir tek karakteri eşler.
  • * "öncekinden sıfır veya daha fazla" demek. a* hem boş dizeyi hem a, aa, aaa'yı eşler.
  • + "öncekinden bir veya daha fazla" demek. a+ tek başına a'yı veya birden fazla a'yı eşler ama boş dizeyi eşlemez.
  • ? "sıfır ya da bir", yani opsiyonel. renkli? hem renk hem renkli'yi eşler.
  • ^ deseni satır başına sabitler. ^Merhaba sadece satırın en başındaki Merhaba'yı bulur.
  • $ satır sonuna sabitler. \.$ noktayla biten her satırı bulur.
  • [abc] karakter sınıfıdır, a, b veya c'den birini eşler. [a-z] herhangi bir küçük harf, [0-9] herhangi bir rakam, [A-Za-z0-9] herhangi bir harf veya rakam demektir.
  • Köşeli parantezin içine konan ^ ise tersi anlamına gelir: [^abc] a, b ve c dışındaki her karakteri eşler.
  • \d herhangi bir rakam, \w herhangi bir kelime karakteri (harf, rakam, alt çizgi), \s herhangi bir boşluk (boşluk, tab, yeni satır) için kısayoldur. Büyük harfli karşılıkları \D, \W, \S tam tersini ifade eder.
  • Parantezler ( ) hem birden fazla karakteri tek seferde sayılandırmak hem de yakaladığın metni değiştirme alanında tekrar kullanmak için grup oluşturur.
  • Dik çizgi | VEYA demektir. kedi|köpek hem kedi'yi hem köpek'i eşler.
  • Ters bölü \ özel bir karakteri kaçışlayıp düz harf gibi davranmasını sağlar. Gerçek bir nokta arıyorsan \. yaz, gerçek bir parantez arıyorsan \( yaz.

Sabitleyiciler, sayısallaştırıcılar ve açgözlülük tuzağı

^ ve $ sabitleyicileri keskin desen yazmanın anahtarıdır. Onlar olmadan regex metinde serbestçe yüzer ve genellikle istediğinden fazlasını yakalar. Onlarla deseni satırın başına ya da sonuna iğnelersin; "rakamla başlayan her satır" derken kastettiğin tam olarak budur.

*, +, ? ve {2,4} gibi sayısallaştırıcılar öncekinin kaç kez tekrar edeceğini belirler. Bilmen gereken şu: bunlar varsayılan olarak açgözlüdür ve eldelerini olabildiğince genişletirler. Eğer <.+> yazıp <b>selam</b> metninde çalıştırırsan ayrı ayrı <b> ve </b> bulmasını beklersin. Aslında tek seferde tüm <b>selam</b> parçasını eşler çünkü + açgözlüdür. Soru işareti ekleyip <.+?> yapınca sayısallaştırıcı tembelleşir, mümkün olan en azı eşler. Bu küçük numara saatlerce hata ayıklamadan kurtarır.

Bul-değiştir için gruplar ve geri başvurular

Parantezler iki iş yapar. Birincisi, bir parçayı sayısallaştırmana izin verir: (ab)+ ab, abab, ababab'i eşler. İkincisi ve çok daha güçlüsü, eşlediği şeyi numaralı bir slota yakalar. Bu slotu çoğu editörde değiştirme alanında $1 (bazısında \1) ile çağırırsın. İlk parantez $1, ikincisi $2, böyle gider.

Metni yeniden sıralamanın yolu budur. Tablonda Soyad, Ad şeklinde yazılmış bir liste var ve Ad Soyad istiyorsun diyelim. Aramaya ([A-Za-zçğıöşü]+), ([A-Za-zçğıöşü]+) yaz, değiştirmeye $2 $1 yaz. Binlerce satırda tek hamlede bitti. Aşağıdaki tariflerin neredeyse hepsi aynı numarayı kullanıyor; o yüzden "sol tarafta parantez, sağ tarafta dolar-numara" fikrine alışmak çok kıymetli.

Tarif 1: Dağınık metinden tüm e-posta adreslerini çekmek

E-posta adresleri dışa aktarmaların, imza bloklarının ve CRM kalabalığının her yerinde. Aşağıdaki desen makul bir varsayılan. RFC tam uyumlu değil (zaten hiçbir regex tam değildir) ama normal belgelerdeki her gerçekçi adresi yakalar.

[\w.+-]+@[\w-]+\.[\w.-]+

Tarif 2: Yaygın biçimlerdeki telefon numaralarını bulmak

Telefon numaraları regex'in dağınık girdiyi nasıl ehlileştirdiğine güzel bir örnek. Aşağıdaki desen 0532 123 45 67, (0212) 555 12 34, +90 532.123.45.67 gibi varyantların çoğunu yakalar. Yalnızca yerel numara arıyorsan baştaki + ve ülke kodunu çıkarabilirsin.

\+?\d{1,3}?[\s.-]?\(?\d{2,4}\)?[\s.-]?\d{3,4}[\s.-]?\d{2,4}

Tarif 3: Tarih biçimini YYYY-MM-DD'den DD/MM/YYYY'ye çevirmek

Bu klasik grup ve geri başvuru hamlesidir. Tarihin her parçasını yakala, değiştirme alanında sırasını değiştir. Bul kutusuna aşağıdaki deseni, Değiştir kutusuna $3/$2/$1 yapıştır.

(\d{4})-(\d{2})-(\d{2})

Tarif 4: Belgedeki tüm boş satırları silmek

Yapıştırılmış uzun metinler genellikle sayfa sayısını ikiye katlayan boş satırlarla gelir. Aşağıdaki desen yalnızca opsiyonel boşluk ve yeni satırdan oluşan satırları eşler. Değiştir kutusunu boş bırakırsan belge tek satırlı hale iner.

^\s*\n

Tarif 5: İkili, üçlü, kontrolden çıkmış boşlukları teke indirmek

OCR çıktıları, kopyalanmış PDF'ler ve eski Word belgeleri kelimelerin arasına çift boşluk serpmekle ünlüdür. İki veya daha fazla ardışık boşluğu bul, tek boşlukla değiştir.

 {2,}

Tarif 6: Bir metin bloğundan tüm URL'leri çıkarmak

Bir makaleden, e-posta dökümünden veya sohbet kaydından tüm bağlantıları çekmen mi gerekiyor? Aşağıdaki desen yol ve sorgu dizgisi dahil http ve https URL'lerini yakalar. Editörünün "tüm eşleşmeleri kopyala" özelliğiyle birleştir veya yakaladıklarını yeni bir belgeye yapıştır.

https?://[\w.-]+(?:/[\w./?=&%#-]*)?

Tarif 7: Bir listedeki her ismin baş harfini büyütmek

Küçük harfle yazılmış isimlerle dolu (ayşe yılmaz, mehmet demir) bir sütunun varsa biçimlendirmeyi iki adımda düzeltebilirsin. Önce aşağıdaki deseni bul; o, her kelimenin ilk harfini yakalar. Editörlerin çoğu \u$1 (ilk yakalamayı büyük harfe çevir) ile değiştirmene izin verir. İzin vermiyorsa listeyi özel bir vaka çeviriciden geçir. Multilities'in case-converter aracı bunu tek tıkla yapar.

\b([a-zçğıöşü])

Tarif 8: Yalnızca rakam içeren satırları tutmak

Bazı editörler regex'e uymayan her satırı silmene izin verir. Aşağıdaki desenle birleştirince uzun bir log dosyasını ya da not belgesini yalnızca rakam içeren satırlara indirgersin; PDF'den yapıştırılan banka ekstrelerini temizlemek için harikadır.

^.*\d+.*$

Tarif 9: Her satırın sonundaki boşlukları temizlemek

Satır sonu boşlukları görünmez ama diff araçlarını, e-posta imzalarını, kod yorumlarını bozar. Bul ve hiçbir şeyle değiştir. Aşağıdaki desen satır sonundan hemen önce duran bir veya daha fazla boşluğu ya da tab'ı eşler.

[ \t]+$

Tarif 10: Sosyal medya çıktısından hashtag'leri çıkarmak

Pazarlama ekipleri tweet, LinkedIn ve Instagram metinlerini dışa aktarıp hangi hashtag'lerin geçtiğini saymak ister. Aşağıdaki desen, hemen ardından bir veya daha fazla kelime karakteri gelen # işaretini bulur; çevresindeki noktalama işaretlerini yanına almaz.

#\w+

Bunları kendi aracında nasıl denersin?

Google Docs'ta Düzenle, sonra Bul ve değiştir menüsünü aç ve "Düzenli ifadeler kullanarak eşleştir" kutusunu işaretle. Microsoft Word'de Bul ve Değiştir penceresini aç, genişlet, "Joker karakter kullan" kutusunu işaretle (Word'ün lehçesi benzer ama tıpatıp aynı değildir, yukarıdaki desenleri ufak değişikliklerle uygulamak gerekir). Notion'da regex bazı veritabanı özelliklerinde ve entegrasyonlarda destekleniyor; bul çubuğu ise düz metin arar.

Google Sheets'te deseni REGEXMATCH, REGEXEXTRACT veya REGEXREPLACE içine sar: =REGEXEXTRACT(A2; "[\w.+-]+@[\w-]+\.[\w.-]+") A2 hücresindeki e-postayı çeker. Excel'in yeni REGEXEXTRACT, REGEXREPLACE ve REGEXTEST fonksiyonları benzer çalışır. VS Code, Sublime ve çoğu kod editöründe arama çubuğundaki .* simgesine tıklayarak aramayı regex moduna alırsın.

Bir desen yanlış davrandığında ona dikilip bakma. Eşleşmeleri sen yazarken anlık vurgulayan bir regex test aracına bırak. Multilities ücretsiz bir /tools/regex-tester sunuyor ve /tools/find-replace aracıyla yapıştırdığın metin üzerinde desenini denerken orijinal belgeye dokunmuyor. Test aracında denemek saniye sürer; Word'ün içinde Geri Al'a basa basa denemek dakika.

Sık yapılan hatalar ve kaçınma yolları

  • Noktayı kaçışlamayı unutmak. Gerçek bir nokta istiyorsan (alan adında, dosya uzantısında, cümle sonunda) \. yaz. Çıplak nokta her şeyi eşler.
  • .* yerine \S+ veya [^,]+ olması gereken yerlerde .* kullanmak. Nokta-yıldız açgözlüdür ve genellikle virgül, tırnak ya da HTML etiketleri arasında istediğinden fazlasını yutar.
  • ^ ve $ ile sabitlerken bunların bazı araçlarda satır bazlı, bazılarında belge bazlı çalıştığını unutmak. Beklenmedik eşleşmeler görüyorsan editörünün "multiline" veya "dotall" anahtarını kontrol et.
  • Lehçeleri karıştırmak. JavaScript, Python, PCRE, Word jokerleri ve POSIX regex söz diziminin çoğunu paylaşır ama lookaround ya da adlandırılmış grup gibi uç noktalarda ayrılır. Bir uygulamada çalışan desen başka bir yerde takıldığında suçlu genelde lehçe farkıdır.
  • Değiştirme için parantez kullanmamak. Eşleşenin bir parçasını korumak istiyorsan onu yakalamalısın. Parantez yoksa $1 veya \1 ile hiçbir şeye atıfta bulunamazsın.

Seni hızlandıracak kısa bir iş akışı

Bir belgeyi temizlemen gerektiğinde mükemmel regex'i baştan yazmaya çalışma. Dağınık metinden iki üç örnek satır seç ve bunları bir regex test aracına yapıştır. Önce bir örneğin düz halini yaz, sonra parça parça yükselt: rakamların yerini \d+ ile, değişen ada \w+ ile, değişebilen noktalama işaretlerini bir karakter sınıfıyla doldur. Her yükseltmeden sonra örneklerin hâlâ eşleşip eşleşmediğini ve istemediğin şeyleri yakalamaya başlayıp başlamadığını kontrol et.

Desen oturduktan sonra gerçek belgenin Bul kutusuna kopyala ve önce tek bir değiştirme yaparak büyük ölçekte aynı şekilde davranıp davranmadığını gör. Belge önemliyse kopyası üzerinde çalış, Geri Al'ı cömertçe kullan. Bu döngüyü iki üç kez yaşadıktan sonra sık yaptığın temizlikler için desenleri ezbere yazmaya başlarsın ve dağınık bir dışa aktarma karşısında ilk refleksin tek tek tıklamak değil, her şeyi tek seferde halleden küçük bir desen yazmak olur.

Buradan sonra nereye?

Yukarıdaki desenler ve tarifler, gündelik metin temizliği, çıkarma ve yeniden biçimlendirme işlerinin büyük çoğunluğunu kapsar. Daha derine inmek istediğinde lookahead ((?=...)), lookbehind ((?<=...)), yakalamayan grup ((?:...)) ve adlandırılmış yakalama ((?<yil>\d{4})) gibi konulara bak. Günlük iş için şart değiller ama gerçekten zor metinlerle karşılaştığında çok zarif çözümler sunarlar.

Regex, başka hiçbir teknik beceriden çok kısa ve sık pratiği ödüllendirir. En çok kullandığın beş tarifi bir not dosyasına kaydet, yenisini keşfettikçe oraya yapıştır; birkaç ay içinde ofiste tablosu dağılan herkesin ilk koştuğu kişi sen olursun. İnan, oldukça keyifli bir konum.

Bu araçları dene