2012-04-19 18 views
5

Dizeleri değiştirmeye çalışan bir arama değiştirme komut dosyası var. Zaten büyük/küçük harf duyarsız aramalar ve "kaçtı" eşleşmeleri yapma seçenekleri vardır (örneğin, arama için% aranmasına izin verir.Dizeleri değiştirmek için string.gsub işlevini kullanın, ancak yalnızca tüm kelimeler

Artık yalnızca tüm sözcükleri eşleştirmem istendi,% s eklemeye çalıştım. her bir son, ama bu bir dizenin sonunda kelimelerle eşleşmiyor ve bu durumda, bu boşluklar sırasında değiştirilen beyaz boşluklu nesnelerin nasıl değiştirileceğini öğrenemiyorum.

Yeniden yapmam gerekiyor mu? betik string.find kullanarak ve bu sözcükleri kontrol etmek için mantık ekleyebilir veya desenler ile bu mümkün olabilir

Büyük/küçük harfe duyarlı ve kaçılan öğeler için kullandığım iki işlev, her ikisini de aramayı döndürür.

-- Build Pattern from String for case insensitive search 
function nocase (s) 
     s = string.gsub(s, "%a", function (c) 
      return string.format("[%s%s]", string.lower(c), 
              string.upper(c)) 
      end) 
     return s 
    end 
function strPlainText(strText) 
    -- Prefix every non-alphanumeric character (%W) with a % escape character, where %% is the % escape, and %1 is original character 
    return strText:gsub("(%W)","%%%1") 
end 

Şimdi istediğimi yapmanın bir yolunu biliyorum, ancak bu hiç de yetersiz. Daha iyi bir yolu var mı? Eğer nocase() foo geçirirseniz

local strToString = '' 
    local strSearchFor = strSearchi 
    local strReplaceWith = strReplace 
    bSkip = false 
    if fhGetDataClass(ptr) == 'longtext' then 
     strBoxType = 'm' 
    end 
    if pWhole == 1 then 
    strSearchFor = '(%s+)('..strSearchi..')(%s+)' 
    strReplaceWith = '%1'..strReplace..'%3' 
    end 
    local strToString = string.gsub(strFromString,strSearchFor,strReplaceWith) 
    if pWhole == 1 then 
    -- Special Case search for last word and first word 
     local strSearchFor3 = '(%s+)('..strSearchi..')$' 
     local strReplaceWith3 = '%1'..strReplace 
     strToString = string.gsub(strToString,strSearchFor3,strReplaceWith3) 
     local strSearchFor3 = '^('..strSearchi..')(%s+)' 
     local strReplaceWith3 = strReplace..'%2' 
     strToString = string.gsub(strToString,strSearchFor3,strReplaceWith3) 
    end 

cevap

3

Şimdi istediğimi yapmanın bir yolu var, ama bu hiç de yetersiz. Daha iyi bir yolu var mı?

Lua en model eşleştirme kütüphanenin bir belgesiz özelliği yoktur izin verecek Frontier Pattern, böyle bir şey yazmak seslendi:

function replacetext(source, find, replace, wholeword) 
    if wholeword then 
    find = '%f[%a]'..find..'%f[%A]' 
    end 
    return (source:gsub(find,replace)) 
end 

local source = 'test testing this test of testicular footest testimation test' 
local find = 'test' 
local replace = 'XXX' 
print(replacetext(source, find, replace, false)) --> XXX XXXing this XXX of XXXicular fooXXX XXXimation XXX  
print(replacetext(source, find, replace, true)) --> XXX testing this XXX of testicular footest testimation XXX 
1

sen demek, [fooFOO] yerine [fF] [oO] [oO] arasında istiyorsun? eğer öyleyse, bunu deneyebilir misin?

function nocase (s) 
     s = string.gsub(s, "(%a+)", function (c) 
      return string.format("[%s%s]", string.lower(c), 
              string.upper(c)) 
      end) 
     return s 
end 

ve kelimelere bir cümle bölmek için kolay bir yol isterseniz bunu kullanabilirsiniz: Eğer kelime bölünmüş döndüklerinde o kelimelerin üzerinde yineleme oldukça kolaydır,

function split(strText) 
    local words = {} 
    string.gsub(strText, "(%a+)", function(w) 
            table.insert(words, w) 
            end) 
    return words 
end 

masada ve her kelimeye karşı tam bir karşılaştırma yapın.

+0

Ben şimdi sahip işlenmiş arama dizesi kullanmak yapmanız gerekenler yok ya da bir varyasyon ve sadece tüm kelimeleri eşleştirmek için olsun, bu yüzden "sokak" için arama ve sadece "sokak" eşleşecek ve "broadstreet" değil –

+0

eşleşir nocase() ve strPlainText() geri almak değerlerini nasıl kullanıyorsunuz ? Bu çok daha alakalı ... –

İlgili konular