VBA RegExp' de ilave işaret getirme

Katılım
29 Ocak 2024
Mesajlar
188
Excel Vers. ve Dili
Office 2016
Kıymetli hocalarım merhabalar,
Aşağıdaki kod ile bir metin içindeki sadece sayısal degerleri alabiliyoruz,
sayısal degerlere ilaveten "+" işaretini de alması nasıl sağlanabilir?

Kod:
Sub regexPattern()
Dim deger
Dim regExp As Object
    Set regExp = CreateObject("VBscript.RegExp")
    regExp.Global = True
    
    regExp.Pattern = "[^0-9]"

        deger = Cells(3, 1).Value
        Cells(3, 2) = CStr(regExp.Replace(deger, ""))
    
End Sub
yardımlarınız için teşekkürler,
iyi akşamlar.
 
Katılım
11 Temmuz 2024
Mesajlar
321
Excel Vers. ve Dili
Excel 2021 Türkçe
Merhaba, şu şekilde dener misiniz;

Kod:
Sub regexPattern()
    Dim deger
    Dim regExp As Object
    Set regExp = CreateObject("VBscript.RegExp")
    regExp.Global = True
    
    regExp.Pattern = "[^0-9\+]"
    
    deger = Cells(3, 1).Value
    Cells(3, 2) = CStr(regExp.Replace(deger, ""))
    
End Sub
İyi çalışmalar, iyi akşamlar.
 
Katılım
29 Ocak 2024
Mesajlar
188
Excel Vers. ve Dili
Office 2016
Merhaba, şu şekilde dener misiniz;

Kod:
Sub regexPattern()
    Dim deger
    Dim regExp As Object
    Set regExp = CreateObject("VBscript.RegExp")
    regExp.Global = True
   
    regExp.Pattern = "[^0-9\+]"
   
    deger = Cells(3, 1).Value
    Cells(3, 2) = CStr(regExp.Replace(deger, ""))
   
End Sub

İyi çalışmalar, iyi akşamlar.
Çok teşekkür ederim Hocam
iyi akşamlar
 
Katılım
29 Ocak 2024
Mesajlar
188
Excel Vers. ve Dili
Office 2016
Merhaba, şu şekilde dener misiniz;

Kod:
Sub regexPattern()
    Dim deger
    Dim regExp As Object
    Set regExp = CreateObject("VBscript.RegExp")
    regExp.Global = True
  
    regExp.Pattern = "[^0-9\+]"
  
    deger = Cells(3, 1).Value
    Cells(3, 2) = CStr(regExp.Replace(deger, ""))
  
End Sub
İyi çalışmalar, iyi akşamlar.
Hocam tekrar merhaba,
bu konuda şöyle bir sorum daha olacak

Aşağıdaki patern' de önce metin içinde başta 0' a, sonra 1'e sonra 2' ye ye göre bakıyor,
strInput = "@122100011122111"

benim burada istediğim, bu sıralamaya bakmaksızın, sadece yan-yana olan adetler tutacak şekilde nasıl düzenlenebilir?
Örnek: 2-3 adet 2 değeri başta da olabilir. arada başka değerler sonra 3-4 adet 1, en sonunda da 3-5 adet 0 gibi olabilir
burada sadece yana-yana adetler tutsun, konumlara farklı yerlerde olabilir.

bu şekilde de olabilir.
"@122100011122111"


Kod:
strInput = "@122100011122111"
strPattern = "([0]{3,5})([1]{3,4})([2]{2,3})"

        If regEx.Test(strInput) Then
          
        End If
tekrar teşekkürler,
 
Katılım
11 Temmuz 2024
Mesajlar
321
Excel Vers. ve Dili
Excel 2021 Türkçe
Hocam tekrar merhaba,
bu konuda şöyle bir sorum daha olacak

Aşağıdaki patern' de önce metin içinde başta 0' a, sonra 1'e sonra 2' ye ye göre bakıyor,
strInput = "@122100011122111"

benim burada istediğim, bu sıralamaya bakmaksızın, sadece yan-yana olan adetler tutacak şekilde nasıl düzenlenebilir?
Örnek: 2-3 adet 2 değeri başta da olabilir. arada başka değerler sonra 3-4 adet 1, en sonunda da 3-5 adet 0 gibi olabilir
burada sadece yana-yana adetler tutsun, konumlara farklı yerlerde olabilir.

bu şekilde de olabilir.
"@122100011122111"


Kod:
strInput = "@122100011122111"
strPattern = "([0]{3,5})([1]{3,4})([2]{2,3})"

        If regEx.Test(strInput) Then
         
        End If
tekrar teşekkürler,
Bu şekilde deneyip sonucu paylaşabilir misiniz hocam;

Kod:
Sub KontrolEt()
    Dim strInput As String
    Dim regEx As Object
    Dim matches As Object
    Dim bulundu As Boolean
    
    strInput = "@122100011122111"
    Set regEx = CreateObject("VBScript.RegExp")
    regEx.Global = True
    regEx.IgnoreCase = True
    
    Dim sifirVar As Boolean, birVar As Boolean, ikiVar As Boolean
    sifirVar = False
    birVar = False
    ikiVar = False
    
    regEx.Pattern = "0{3,5}"
    If regEx.Test(strInput) Then
        Set matches = regEx.Execute(strInput)
        sifirVar = True
        Debug.Print "Bulunan 0 grubu: " & matches(0)
    End If
    
    regEx.Pattern = "1{3,4}"
    If regEx.Test(strInput) Then
        Set matches = regEx.Execute(strInput)
        birVar = True
        Debug.Print "Bulunan 1 grubu: " & matches(0)
    End If
    
    regEx.Pattern = "2{2,3}"
    If regEx.Test(strInput) Then
        Set matches = regEx.Execute(strInput)
        ikiVar = True
        Debug.Print "Bulunan 2 grubu: " & matches(0)
    End If
    
    If sifirVar And birVar And ikiVar Then
        Debug.Print "Tüm koşullar sağlanıyor!"
    Else
        Debug.Print "Tüm koşullar sağlanmıyor."
        If Not sifirVar Then Debug.Print "3-5 adet yan yana 0 bulunamadı."
        If Not birVar Then Debug.Print "3-4 adet yan yana 1 bulunamadı."
        If Not ikiVar Then Debug.Print "2-3 adet yan yana 2 bulunamadı."
    End If
End Sub
 
Katılım
2 Temmuz 2014
Mesajlar
222
Excel Vers. ve Dili
2021 Türkçe, 64bit
@pitchoute hocam bulananlar sayılacak mı yoksa replace ile değiştirilecek mi?
ilk mesajdaki kodda sadece değiştirilme kullanılmış?
 
Katılım
11 Temmuz 2024
Mesajlar
321
Excel Vers. ve Dili
Excel 2021 Türkçe
Evet, ilk verilen regexPattern kodunda sadece değiştirme işlemi yapılıyor:
Kod:
regExp.Pattern = "[^0-9]"
Cells(3, 2) = CStr(regExp.Replace(deger, ""))
Bu kod sayı olmayan karakterleri boş string ile değiştiriyor, yani sayma işlemi yok.

Sayma işlemi için;

Kod:
Set matches = regExp.Execute(strInput)
sayac = matches.Count
Değiştirme işlemi için;
Kod:
sonuc = regExp.Replace(strInput, "[YENI_DEGER]")
 
Katılım
2 Temmuz 2014
Mesajlar
222
Excel Vers. ve Dili
2021 Türkçe, 64bit
"(([0]{3,5})|([1]{3,4})|([2]{2,3}))" eğer sadece değiştirilecekse pattern bu şekilde düzenlenebilir.
koşullar "|" ile ayrılınca "veya" gibi çalışır
 

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,382
Excel Vers. ve Dili
Office 365 (64 bit) - Türkçe
"(([0]{3,5})|([1]{3,4})|([2]{2,3}))" eğer sadece değiştirilecekse pattern bu şekilde düzenlenebilir.
koşullar "|" ile ayrılınca "veya" gibi çalışır
Bu üç koşulun hepsi true mu olmalı? Yoksa biri veya ikisi yeterli mi? Soru açık değil, uzayıp gidiyor...
 
Katılım
2 Temmuz 2014
Mesajlar
222
Excel Vers. ve Dili
2021 Türkçe, 64bit
Bu üç koşulun hepsi true mu olmalı? Yoksa biri veya ikisi yeterli mi? Soru açık değil, uzayıp gidiyor...
Haklısınız hocam, daha ayrıntılı bir açıklama gerekiyor. Birkaç farklı örnek için sonuçların ne olması gerektiği ve neden oyle olması gerektiği de açıklanmalı.
 
Katılım
29 Ocak 2024
Mesajlar
188
Excel Vers. ve Dili
Office 2016
Bu şekilde deneyip sonucu paylaşabilir misiniz hocam;

Kod:
Sub KontrolEt()
    Dim strInput As String
    Dim regEx As Object
    Dim matches As Object
    Dim bulundu As Boolean
   
    strInput = "@122100011122111"
    Set regEx = CreateObject("VBScript.RegExp")
    regEx.Global = True
    regEx.IgnoreCase = True
   
    Dim sifirVar As Boolean, birVar As Boolean, ikiVar As Boolean
    sifirVar = False
    birVar = False
    ikiVar = False
   
    regEx.Pattern = "0{3,5}"
    If regEx.Test(strInput) Then
        Set matches = regEx.Execute(strInput)
        sifirVar = True
        Debug.Print "Bulunan 0 grubu: " & matches(0)
    End If
   
    regEx.Pattern = "1{3,4}"
    If regEx.Test(strInput) Then
        Set matches = regEx.Execute(strInput)
        birVar = True
        Debug.Print "Bulunan 1 grubu: " & matches(0)
    End If
   
    regEx.Pattern = "2{2,3}"
    If regEx.Test(strInput) Then
        Set matches = regEx.Execute(strInput)
        ikiVar = True
        Debug.Print "Bulunan 2 grubu: " & matches(0)
    End If
   
    If sifirVar And birVar And ikiVar Then
        Debug.Print "Tüm koşullar sağlanıyor!"
    Else
        Debug.Print "Tüm koşullar sağlanmıyor."
        If Not sifirVar Then Debug.Print "3-5 adet yan yana 0 bulunamadı."
        If Not birVar Then Debug.Print "3-4 adet yan yana 1 bulunamadı."
        If Not ikiVar Then Debug.Print "2-3 adet yan yana 2 bulunamadı."
    End If
End Sub
Teşekkürler Hocam
 
Katılım
29 Ocak 2024
Mesajlar
188
Excel Vers. ve Dili
Office 2016
3 koşul da true olunca mesela ne olmalı?
3 koşulda da sadetler sağlanacak; yalnız konumları önemli değil;

0' lar önde olacak bir koşul yok; 0, 1' den sonra da olabilir; 0, 2' den sonra da olabilir;
2' ler sonda olacak gibi koşul yok; 2 en başta da olabilir, ortada da olabilir
tek koşul yeter ki yan-yana olan adeti tutsun.

#5 nolu mesajdaki kodlar tam istediğime göre;

aşağıdaki gibi düşünülebilir...
strPattern = "([0]{3,5})([1]{3,4})([2]{2,3})"
strPattern = "(([1]{3,4})([2]{2,3}[0]{3,5}))"
strPattern = "([0]{3,5})([2]{2,3})([1]{3,4})"
strPattern = "([2]{2,3})([0]{3,5})([1]{3,4})"
strPattern = "([2]{2,3})([1]{3,4})([0]{3,5})"
........
.............


iyi Çalışmalar.
 
Katılım
2 Temmuz 2014
Mesajlar
222
Excel Vers. ve Dili
2021 Türkçe, 64bit
aşağıdaki kodu dener misiniz?

Kod:
Sub SayiGrp()
    Dim regEx As Object
    Dim strInput As String
    
    strInput = "@122100011122111"
    Set regEx = CreateObject("VBScript.RegExp")
    
    With regEx
        .Global = True
        .MultiLine = True
        ' (?=.*0{3,5}) › içinde en az bir yerde 0{3,5} aranacak
        ' (?=.*1{3,4}) › içinde en az bir yerde 1{3,4} aranacak
        ' (?=.*2{2,3}) › içinde en az bir yerde 2{2,3} aranacak
        ' ^.+$         › tüm stringi kapsayan yakalama (zorunlu)
        .Pattern = "^(?=.*0{3,5})(?=.*1{3,4})(?=.*2{2,3}).+$"

        If .Test(strInput) Then
            MsgBox "doğru"
        Else
            MsgBox "yanlış"
        End If
    End With
End Sub
 
Katılım
29 Ocak 2024
Mesajlar
188
Excel Vers. ve Dili
Office 2016
aşağıdaki kodu dener misiniz?

Kod:
Sub SayiGrp()
    Dim regEx As Object
    Dim strInput As String
   
    strInput = "@122100011122111"
    Set regEx = CreateObject("VBScript.RegExp")
   
    With regEx
        .Global = True
        .MultiLine = True
        ' (?=.*0{3,5}) › içinde en az bir yerde 0{3,5} aranacak
        ' (?=.*1{3,4}) › içinde en az bir yerde 1{3,4} aranacak
        ' (?=.*2{2,3}) › içinde en az bir yerde 2{2,3} aranacak
        ' ^.+$         › tüm stringi kapsayan yakalama (zorunlu)
        .Pattern = "^(?=.*0{3,5})(?=.*1{3,4})(?=.*2{2,3}).+$"

        If .Test(strInput) Then
            MsgBox "doğru"
        Else
            MsgBox "yanlış"
        End If
    End With
End Sub
Hocam çok teşekkürler,
tam istediğim gibi oldu;
buradaki ? = . * işaretleri ne anlama gelmektedir?
bu konuda eğitim vermeniz mümkün müdür?
iyi Çalışmalar
 

volki_112

Altın Üye
Katılım
29 Eylül 2023
Mesajlar
565
Excel Vers. ve Dili
2019 Türkçe
Altın Üyelik Bitiş Tarihi
13-12-2029
Hocam çok teşekkürler,
tam istediğim gibi oldu;
buradaki ? = . * işaretleri ne anlama gelmektedir?
bu konuda eğitim vermeniz mümkün müdür?
iyi Çalışmalar
YZ açıklaması

Kod, verilen strInput değişkeninin içeriğini belirli bir düzenli ifade (regular expression) ile test ediyor. Düzenli ifade, dizede belirli sayıda 0, 1 ve 2 rakamlarının bulunup bulunmadığını kontrol ediyor.

Şimdi düzenli ifadenin parçalarını ve strInput'u nasıl değerlendirdiğini adım adım inceleyelim:
  • ^: Dizenin başlangıcını belirtir.
  • (?=.*0{3,5}): Bu bir "positive lookahead" ifadesidir. Dizenin herhangi bir yerinde en az 3 ve en fazla 5 adet ardışık '0' olup olmadığını kontrol eder, ancak bu '0'ları eşleşmenin bir parçası olarak tüketmez.
  • (?=.*1{3,4}): Bu da bir positive lookahead ifadesidir. Dizenin herhangi bir yerinde en az 3 ve en fazla 4 adet ardışık '1' olup olmadığını kontrol eder, ancak bu '1'leri eşleşmenin bir parçası olarak tüketmez.
  • (?=.*2{2,3}): Bu da bir positive lookahead ifadesidir. Dizenin herhangi bir yerinde en az 2 ve en fazla 3 adet ardışık '2' olup olmadığını kontrol eder, ancak bu '2'leri eşleşmenin bir parçası olarak tüketmez.
  • .+: Bu ifade, dizedeki bir veya daha fazla karakteri eşleştirir. Lookahead ifadeleri koşulları sağladıktan sonra, bu kısım tüm dizeyi yakalar.
  • $: Dizenin sonunu belirtir.
Şimdi strInput = "@122100011122111" dizesini bu kurallara göre değerlendirelim:
  1. (?=.*0{3,5}): Dizede "000" kısmı bulunmaktadır. Bu koşul sağlanır.
  2. (?=.*1{3,4}): Dizede "111" (3 adet) ve "1111" (4 adet) kısımları bulunmaktadır. Bu koşul da sağlanır.
  3. (?=.*2{2,3}): Dizede "22" (2 adet) kısmı bulunmaktadır. Bu koşul da sağlanır.
  4. .+: Lookahead ifadeleri başarılı olduğu için, "@122100011122111" dizisinin tamamı bu kısım tarafından yakalanır.
Tüm koşullar sağlandığı için, .Test(strInput) metodu True değerini döndürecektir.

Dolayısıyla, kodun çıktısı bir mesaj kutusu içinde "doğru" olacaktır.
 
Katılım
29 Ocak 2024
Mesajlar
188
Excel Vers. ve Dili
Office 2016
YZ açıklaması

Kod, verilen strInput değişkeninin içeriğini belirli bir düzenli ifade (regular expression) ile test ediyor. Düzenli ifade, dizede belirli sayıda 0, 1 ve 2 rakamlarının bulunup bulunmadığını kontrol ediyor.

Şimdi düzenli ifadenin parçalarını ve strInput'u nasıl değerlendirdiğini adım adım inceleyelim:
  • ^: Dizenin başlangıcını belirtir.
  • (?=.*0{3,5}): Bu bir "positive lookahead" ifadesidir. Dizenin herhangi bir yerinde en az 3 ve en fazla 5 adet ardışık '0' olup olmadığını kontrol eder, ancak bu '0'ları eşleşmenin bir parçası olarak tüketmez.
  • (?=.*1{3,4}): Bu da bir positive lookahead ifadesidir. Dizenin herhangi bir yerinde en az 3 ve en fazla 4 adet ardışık '1' olup olmadığını kontrol eder, ancak bu '1'leri eşleşmenin bir parçası olarak tüketmez.
  • (?=.*2{2,3}): Bu da bir positive lookahead ifadesidir. Dizenin herhangi bir yerinde en az 2 ve en fazla 3 adet ardışık '2' olup olmadığını kontrol eder, ancak bu '2'leri eşleşmenin bir parçası olarak tüketmez.
  • .+: Bu ifade, dizedeki bir veya daha fazla karakteri eşleştirir. Lookahead ifadeleri koşulları sağladıktan sonra, bu kısım tüm dizeyi yakalar.
  • $: Dizenin sonunu belirtir.
Şimdi strInput = "@122100011122111" dizesini bu kurallara göre değerlendirelim:
  1. (?=.*0{3,5}): Dizede "000" kısmı bulunmaktadır. Bu koşul sağlanır.
  2. (?=.*1{3,4}): Dizede "111" (3 adet) ve "1111" (4 adet) kısımları bulunmaktadır. Bu koşul da sağlanır.
  3. (?=.*2{2,3}): Dizede "22" (2 adet) kısmı bulunmaktadır. Bu koşul da sağlanır.
  4. .+: Lookahead ifadeleri başarılı olduğu için, "@122100011122111" dizisinin tamamı bu kısım tarafından yakalanır.
Tüm koşullar sağlandığı için, .Test(strInput) metodu True değerini döndürecektir.

Dolayısıyla, kodun çıktısı bir mesaj kutusu içinde "doğru" olacaktır.
Bilgilendirme için çok teşekkürler Hocam
bu konuda müsaadelerinizle bir sorum daha olacak; sorumu bir sonraki mesajda göndereceğim
iyi Çalışmalar
 
Katılım
29 Ocak 2024
Mesajlar
188
Excel Vers. ve Dili
Office 2016
Bilgilendirme için çok teşekkürler Hocam
bu konuda müsaadelerinizle bir sorum daha olacak; sorumu bir sonraki mesajda göndereceğim
iyi Çalışmalar
Kıymetli Hocalarım tekrar merhaba;
Regular Expressions (Regex) olayı ile ilgili bir sorum daha olacak

Pattern = "@122100011122111"

bu şekilde olsun;

yeni gireceğim aynı uzunluktaki bir metnin "@122100011b2211a"
bu metni pattern ile karşılaştırarak; aynı konumda olan karakterlerin kaç tanesi bire bir aynı;
örnek burada sadece 2 karakter uymuyor, diğerleri bire-bir aynı

sonuç olarak uyan : 14 karakter var, bu 14 sonucuna nasıl ulaşabiliriz?

yardım ve destekleriniz için her zamanki gibi çok teşekkürler,
iyi çalışmalar dilerim.
 

volki_112

Altın Üye
Katılım
29 Eylül 2023
Mesajlar
565
Excel Vers. ve Dili
2019 Türkçe
Altın Üyelik Bitiş Tarihi
13-12-2029
Kıymetli Hocalarım tekrar merhaba;
Regular Expressions (Regex) olayı ile ilgili bir sorum daha olacak

Pattern = "@122100011122111"

bu şekilde olsun;

yeni gireceğim aynı uzunluktaki bir metnin "@122100011b2211a"
bu metni pattern ile karşılaştırarak; aynı konumda olan karakterlerin kaç tanesi bire bir aynı;
örnek burada sadece 2 karakter uymuyor, diğerleri bire-bir aynı

sonuç olarak uyan : 14 karakter var, bu 14 sonucuna nasıl ulaşabiliriz?

yardım ve destekleriniz için her zamanki gibi çok teşekkürler,
iyi çalışmalar dilerim.
Deneyiniz
Kod:
Sub KarakterleriKarsilastir()
    Dim pattern As String
    Dim inputMetin As String
    Dim i As Long
    Dim eslesenKarakterSayisi As Long

    pattern = "@122100011122111"
    inputMetin = "@122100011b2211a"
    eslesenKarakterSayisi = 0

    ' İki metnin de aynı uzunlukta olduğunu varsayıyoruz
    If Len(pattern) = Len(inputMetin) Then
        For i = 1 To Len(pattern)
            If Mid(pattern, i, 1) = Mid(inputMetin, i, 1) Then
                eslesenKarakterSayisi = eslesenKarakterSayisi + 1
            End If
        Next i
        MsgBox "Eşleşen karakter sayısı: " & eslesenKarakterSayisi
    Else
        MsgBox "Pattern ve input metin farklı uzunluklarda."
    End If
End Sub
 
Üst