29 Eyl 2023

/*Yorum satırlarını*/ //seçen regex yazalım.


Bir projemde yazılan yorumların doğruluğunu bulmak için regex ile input'ı validation etmem gerekti. Regex101 sitesini açıp kendim yazmaya çalıştım. // yorum satırı için regex i yazdım. daha sonra işler karıştı yapay zeka varken neden ben yazayım ki dedim. ve işte sonuçlar.

Soru

/* dsa d

asd

*/

bunu seçen bir regex yazar mısın?

Cevap

Regex, düzenli ifadeler olarak da bilinen, metin içindeki belirli desenleri eşleştirmek için kullanılan bir karakter dizisidir. Bunu seçen bir regex yazmak için, önce seçmek istediğiniz metnin nasıl göründüğünü belirlemeniz gerekir. Örneğin, bunu seçen bir regex yazmak istiyorsanız:

/* dsa d

asd

*/

Bu metnin şu özelliklere sahip olduğunu görebilirsiniz:

  • Başında ve sonunda /* ve */ karakterleri vardır.
  • İçinde birden fazla satır vardır.
  • Her satırda ds veya a harfleri vardır.

Bu özellikleri kullanarak, bunu seçen bir regex yazabilirsiniz. Regex’in nasıl çalıştığını anlamak için, bazı temel sembollerin anlamlarını bilmek gerekir:

  • . herhangi bir tek karakteri eşleştirir.
  • * önceki karakterin sıfır veya daha fazla tekrarını eşleştirir.
  • + önceki karakterin bir veya daha fazla tekrarını eşleştirir.
  • ? önceki karakterin sıfır veya bir tekrarını eşleştirir.
  • [] köşeli parantez içindeki herhangi bir karakteri eşleştirir.
  • [^] köşeli parantez içindeki hiçbir karakteri eşleştirmez.
  • \n yeni satır karakterini eşleştirir.
  • \s boşluk, sekme veya yeni satır gibi boşluk karakterlerini eşleştirir.
  • \S boşluk olmayan karakterleri eşleştirir.
  • () parantez içindeki ifadeyi gruplar ve daha sonra geri referans olarak kullanılabilir.
  • \1\2, … gruplanmış ifadelerin ilk, ikinci, … tekrarını eşleştirir.

Bu sembollerden bazılarını kullanarak, bunu seçen bir regex yazabilirsiniz. Örneğin, şöyle yazabilirsiniz:

/\*[\s\S]*?\*/

Bu regex şöyle çalışır:

  • /\* metnin başında /* karakterlerini eşleştirir.
  • [\s\S] boşluk veya boşluk olmayan herhangi bir karakteri eşleştirir.
  • *? önceki karakterin mümkün olduğunca az tekrarını eşleştirir. Bu, açgözlü olmayan bir operatördür ve en kısa eşleşmeyi bulur.
  • \*/ metnin sonunda */ karakterlerini eşleştirir.

Bu regex, istediğiniz metni seçer. Ancak, bu regex’in bazı sınırlamaları vardır. Örneğin, metnin içinde başka /* veya */ karakterleri varsa, bu regex doğru çalışmayabilir. Bu durumda, daha karmaşık bir regex yazmanız gerekebilir. Örneğin, şöyle yazabilirsiniz:

/\*((?:[^*]|\*(?!/))*)\*/

Bu regex şöyle çalışır:

  • /\* metnin başında /* karakterlerini eşleştirir.
  • (?:) parantez içindeki ifadeyi gruplar ama geri referans olarak kullanılmaz.
  • [^*] yıldız olmayan herhangi bir karakteri eşleştirir.
  • \*(?!/) yalnızca sonrasında / olmayan yıldız karakterini eşleştirir. Bu, olumsuz ileri bakış olarak bilinen bir operatördür.
  • * önceki ifadenin sıfır veya daha fazla tekrarını eşleştirir.
  • \*/ metnin sonunda */ karakterlerini eşleştirir.

Bu regex, metnin içindeki /* veya */ karakterlerini dikkate alarak istediğiniz metni seçer. Ancak, bu regex de bazı sınırlamaları vardır. Örneğin, metnin çok uzun olması durumunda, bu regex çok yavaş çalışabilir veya çalışmayabilir. Bu durumda, daha verimli bir regex yazmanız gerekebilir. Örneğin, şöyle yazabilirsiniz:


/\*([^*]|(\*+([^*/]|$)))*\*+/

Bu regex şöyle çalışır:

  • /\* metnin başında /* karakterlerini eşleştirir.
  • [^*] yıldız olmayan herhangi bir karakteri eşleştirir.
  • (\*+([^*/]|$)) bir veya daha fazla yıldız karakterini ve sonrasında / veya metin sonu olmayan herhangi bir karakteri eşleştirir.
  • * önceki ifadenin sıfır veya daha fazla tekrarını eşleştirir.
  • \*+ metnin sonunda bir veya daha fazla yıldız karakterini eşleştirir.

Bu regex, metnin içindeki /* veya */ karakterlerini dikkate alarak istediğiniz metni seçer. Ayrıca, bu regex daha verimli çalışır ve geriye dönük referans kullanmaz.



daha sonra yazdığım regex'in tüm string üzerinde çalışmasını istedim yani yazılan yazının yorum satırını doğrulamak istedim. Regex'lerin başına ^ ve sonuna $ işareti koyarak onları da yaptı. Sonra son halini alan regex'i açıklamasını istedim. İşte sonuçlar: Bu arada regex örneklerini kendisi regex'i yorumlayarak buldu. Şaşırmamak elde değil.


Soru:

(^(\/\/.*(\n\/\/.*|\n)*)$)|(^\/\*([^*]|(\*+([^*/]|$)))*\*+\/$)
bu regexin nasıl çalıştığını açıklar mısın?

Cevap:

Evet, düzenli ifadelerle ilgilendiğiniz anlaşılıyor. Düzenli ifadeler, bir dizede metni eşleştirmek, aramak veya değiştirmek için kullanılabilecek karakter dizileridir. Girdiğiniz ifade, C, C++, Java veya JavaScript gibi bazı programlama dillerinde tek satırlı veya çok satırlı bir yorumu eşleştirebilen bir düzenli ifadedir. Nasıl çalıştığını açıklayayım:

  • İfade, mantıksal VEYA anlamına gelen dikey bir çubuk (|) ile ayrılmış iki parçadan oluşur. Bu, metnin sol kısım veya sağ kısım ile eşleşebileceği anlamına gelir.
  • Sol kısım ^(\/\/.*(\n\/\/.*|\n)*)$'dır, bu da // ile başlayan ve yeni satır karakteri (\n) ile biten tek satırlı bir yorumu eşleştirir. ^ ve $ sembolleri, ifadenin sadece bir kısmını değil, tüm satırı eşleştirmesi gerektiği anlamına gelir. .* ise \n hariç herhangi bir karakter dizisini ifade eder. Parantezler () ise ifadenin parçalarını bir arada gruplamak için kullanılır. (\n\/\/.*|\n)* ise yeni satır karakteri (\n) ile başlayan ve biten veya // ile başlayan ve yeni satır karakteri (\n) ile biten herhangi bir karakter dizisini sıfır veya daha fazla kez tekrar edebileceği anlamına gelir. Örneğin, bu kısım aşağıdaki metinlerle eşleşir:

// Bu bir yorumdur // Bu da bir yorumdur

// Bu başka bir yorumdur \n

  • Sağ kısım ise ^\/\*([^*]|(\*+([^*/]|$)))*\*+\/$'dır, bu da /* ile başlayan ve */ ile biten çok satırlı bir yorumu eşleştirir. Burada \ sembolü, * ve / gibi özel anlamı olan karakterleri kaçış karakteri olarak kullanmak için kullanılır. Yani \* sadece yıldız karakterini ifade eder. [^*] ise yıldız karakteri hariç herhangi bir karakteri ifade eder. (\*+([^*/]|$)))* ise yıldız karakterinin bir veya daha fazla tekrarından sonra gelen ve yıldız veya bölü karakteri olmayan veya dizenin sonu olan herhangi bir karakteri sıfır veya daha fazla kez tekrar edebileceği anlamına gelir. \*+\/$ ise yorumun sonunu belirtmek için en az bir yıldız karakterinden sonra gelen bölü karakterini ve dizenin sonunu ifade eder. Örneğin, bu kısım aşağıdaki metinlerle eşleşir:

/* Bu bir yorumdur */

/* Bu da bir yorumdur */

/* Bu başka bir yorumdur */



Yazdığımız regex'in testine gelelim 

https://regex101.com/r/n1SmqW/1 bu adresten yazılan regex'i inceleyebilirsiniz.


Okuyup geçme yorum yap lütfen :)

Yorumunuz cevaplandığında bildirim almak için Beni bilgilendir'i işaretleyin.
EmojiEmoji