2012-04-19 2 views
5

Ich habe ein Search Replace-Skript, das zum Ersetzen von Zeichenfolgen verwendet wird. Es hat bereits Optionen, um Groß-/Kleinschreibung und "maskiert" Übereinstimmungen zu machen (zB erlaubt Suche nach% (etc in der Suche).Verwenden Sie string.gsub, um Zeichenfolgen zu ersetzen, aber nur ganze Wörter

Wie auch immer ich nun aufgefordert wurde, nur ganze Wörter zu finden, habe ich versucht,% s hinzuzufügen Jedes Ende, aber das stimmt nicht mit den Wörtern am Ende eines Strings überein, und ich kann dann nicht herausfinden, wie man die gefundenen Leerraumfelder während des Ersetzens intakt hält.

Muss ich wiederholen? Das Skript verwendet string.find und fügt Logik für die Wortüberprüfung hinzu oder dies mit Mustern möglich

Die beiden Funktionen, die ich für Groß-/Kleinschreibung und Escape-Elemente verwende, geben beide das Muster zurück, nach dem gesucht wird:

-- 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 

Ich habe einen Weg zu tun, was ich jetzt will, aber es ist unelegant. Gibt es einen besseren Weg?

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 

Antwort

3

habe eine Art zu tun, was ich jetzt will, aber es ist unelegant. Gibt es einen besseren Weg?

Es ist eine nicht dokumentierte Funktion von Lua Pattern-Matching-Bibliothek mit dem Namen der Frontier Pattern, die Sie so etwas schreiben lassen:

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

meinen Sie, wenn Sie nocase() foo passieren, möchten Sie [foofoo] statt [fF] [oO] [oO]? Wenn ja, könntest du das versuchen?

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 

und wenn Sie eine einfache Möglichkeit, wollen einen Satz in Worte zu teilen, können Sie diese verwenden:

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

, wenn Sie die Worte geteilt bekommen haben, ist es ziemlich einfach über die Worte wiederholen in der Tabelle und machen Sie einen vollständigen Vergleich gegen jedes Wort.

+0

Nein, was ich tun müssen, ist die verarbeitete Suchtext habe ich jetzt nutzen oder eine Variante und es nur ganze Wörter zu finden, so suche ich nach "Straße" und es wird nur "Straße" und nicht "Broadstreet" –

+0

Wie verwenden Sie die Werte, die Sie von nocase() und strPlainText() erhalten ? das ist viel relevanter ... –

Verwandte Themen