• DİKKAT

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

RegExp Tüm Eşleşmeleri Çeksin İstiyorum

Katılım
29 Aralık 2007
Mesajlar
12
Excel Vers. ve Dili
2007 Türkçe
Merhaba arkadaşlar,

Biraz araştırma yaparak bir RegExp modülü oluşturdum belirtilen iki metin arasında ki metni seçip sütuna yazıyor, ama yalnızca ilk eşleşmeyi yazıyor. Bunu o sütunda ki tüm eşleşmeleri yazacak hale getirmek istiyorum.

Kullandığım kod şu;

Kod:
Function getYazar(addr As String)

Dim allMatches As Object
Dim RE As Object
Set RE = CreateObject("vbscript.regexp")


RE.Pattern = "\[29617::(.*?)\]"
RE.Global = True
RE.IgnoreCase = True


Set allMatches = RE.Execute(addr)

If (allMatches.Count <> 0) Then
    result = allMatches.Item(0).submatches.Item(0)
End If

getYazar = result
End Function

Yardımcı olursanız sevinirim.
 
Merhaba, aşağıdaki deseni kullanın. Function şekli isteğinize kalmış.

Kod:
\[\d{5,}::(.+?)\]
 
Aşağıdaki fonsiyonu deneyin.
Kod:
Function getYazar(addr As String)
addr = Replace(Trim(Replace(addr, ",", "    ")), "    ", ",")
k = Split(addr, ",")
For i = 0 To UBound(k)
If Left(k(i), 6) = "[29617" Then
y = y & Split(k(i), "::")(1)
End If
Next
y = Replace(y, "]", ", ")
getYazar = Mid(y, 1, Len(y) - 2)
End Function
 
Son düzenleme:
Merhaba, aşağıdaki deseni kullanın. Function şekli isteğinize kalmış.

Kod:
\[\d{5,}::(.+?)\]

Kullandığım pattern'de sorun yok aslında istediğim veriyi çekiyor yani 29617 ID özelliğine sahip veriyi çekiyor. 29618'ler gelmesin istiyorum o yüzden sorun burada değil de o sütunda ki tüm 29617'ye sahip verilerin yazılması.
 
Aşağıdaki fonsiyonu deneyin.
Kod:
Function getYazar(addr As String)
addr = Replace(Trim(Replace(addr, ",", "    ")), "    ", ",")
k = Split(addr, ",")
For i = 0 To UBound(k) - 1
y = y & Split(k(i), "::")(1)
Next
y = Replace(y, "]", ", ")
getYazar = Mid(y, 1, Len(y) - 2)
End Function

Bu şekilde birden fazla veriyi çekiyor ama pattern bana lazım olan şekilde değil, son veriyi çekmiyor arada 26918 ID'ye sahip veri varsa onu da çekiyor!

Net amaç şu sadece 26917 ile işaretli verileri yazmalı virgül yada herhangi bir ayraç ile ayırarak.
 
.......sorun burada değil de o sütunda ki tüm 29617'ye sahip verilerin yazılması.


O zaman, kullandığınız fonksiyonda yapılan aşağıdaki ufak değişiklik işinizi görecektir....

Kod:
Function getYazar(addr As String)
    Dim allMatches As Object
    Dim RE As Object
    Set RE = CreateObject("vbscript.regexp")
    
    RE.Pattern = "\[29617::(.*?)\]"
    RE.Global = True
    RE.IgnoreCase = True
    
    Set allMatches = RE.Execute(addr)
    
    If allMatches.Count >= 1 Then
        For i = 0 To allMatches.Count - 1
            getYazar = getYazar & allMatches.Item(i).submatches.Item(0) & " - "
        Next i
        getYazar = Mid(getYazar, 1, Len(getYazar) - 3)
    Else
        getYazar = ""
    End If
End Function

.
 
Son düzenleme:
@alicimri ve @Haluk ustalar ikinizin de yazdığı son kodlar işe yaradı. İkinize de çok teşekkür ederim ilginiz için.
 
Kolay gelsin ....

.
 
"vbscript.regexp" konusunda bilgim yoktu biraz uğraştım, ilk çalışmam, Alternatif olsun.
Kod:
Function getYazar(addr As String)
Dim turk As String
turk = "ıöşçğüÖÜİÇĞŞ"
Dim allMatches As Object
Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
RE.Pattern = "7::([0-9a-zA-Z " & turk & "]+)"
RE.Global = True
RE.IgnoreCase = True
Set allMatches = RE.Execute(addr)
For Each Match In allMatches
result = result & ", " & Match.submatches(0)
Next Match
getYazar = Mid(result, 3)
End Function
 
Geri
Üst