• DİKKAT

    DOSYA İndirmek/Yüklemek için ÜCRETLİ ALTIN ÜYELİK Gereklidir!
    Altın Üyelik Hakkında Bilgi

VBA RegExp' de ilave işaret getirme

  • Konbuyu başlatan Konbuyu başlatan pNouma
  • Başlangıç tarihi Başlangıç tarihi
Katılım
29 Ocak 2024
Mesajlar
277
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.
 
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
 
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,
 
@pitchoute hocam bulananlar sayılacak mı yoksa replace ile değiştirilecek mi?
ilk mesajdaki kodda sadece değiştirilme kullanılmış?
 
"(([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
 
"(([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...
 
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ı.
 
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
 
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.
 
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
 
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
 
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.
 
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
 
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.
 
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
 
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
Hocam teşekkür ederim,
yalnız ben bunu Regular Expressions (Regex) olayı ile yapmayı öğrenmek istiyordum
Regex kütüphanesi ile yapılma şekli var mıdır?

iyi Çalışmalar dilerim.
 
Hocam teşekkür ederim,
yalnız ben bunu Regular Expressions (Regex) olayı ile yapmayı öğrenmek istiyordum
Regex kütüphanesi ile yapılma şekli var mıdır?

iyi Çalışmalar dilerim.
Deneyiniz.
Kod:
Sub RegexKarakterKarsilastir()
    Dim regEx As Object
    Dim pattern As String
    Dim inputMetin As String
    Dim eslesenKarakterSayisi As Long
    Dim i As Long

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

    Set regEx = CreateObject("VBScript.RegExp")

    If Len(pattern) = Len(inputMetin) Then
        For i = 1 To Len(pattern)
            regEx.Pattern = "^" & Mid(pattern, i, 1) & "$"
            If regEx.Test(Mid(inputMetin, i, 1)) Then
                eslesenKarakterSayisi = eslesenKarakterSayisi + 1
            End If
        Next i
        MsgBox "Regex ile eşleşen karakter sayısı: " & eslesenKarakterSayisi
    Else
        MsgBox "Pattern ve input metin farklı uzunluklarda."
    End If
End Sub
 
yalnız ben bunu Regular Expressions (Regex) olayı ile yapmayı öğrenmek istiyordum
Regex kütüphanesi ile yapılma şekli var mıdır?
programcılıkta kullanılan her fonksiyonun bir amacı vardır ve kendisi için en uygun yerde kullanılmalıdır.
burada regular expression kullanmanın bir mantığı var mı ki?
doğrudan harf, harf kıyas çok daha pratik ve hızlı olacaktır. bildiğim kadarıyla da döngüsüz, parçalamadan doğrudan temiz bir desen bulamıyorsunuz.
 
Geri
Üst