2011-09-06 14 views
6

Sto provando a programmare un addon per WoW (in lua). È un filtro chat basato su parole specifiche. Non riesco a capire come ottenere che la matrice di queste parole sia insensibile alle maiuscole e minuscole, in modo che le combinazioni maiuscole/minuscole della parola corrispondano alla matrice. Qualsiasi idea sarebbe molto apprezzata. Grazie!Array insensibile alle maiuscole in Lua

local function wordFilter(self,event,msg) 
local keyWords = {"word","test","blah","here","code","woot"} 
local matchCount = 0; 
    for _, word in ipairs(keyWords) do 
      if (string.match(msg, word,)) then 
      matchCount = matchCount + 1; 
     end 
    end 
    if (matchCount > 1) then 
      return false; 
    else 
     return true; 
    end 
end 

risposta

3
  1. Definire parole chiave al di fuori della funzione. Altrimenti stai ricreando il tavolo ogni volta solo per scacciarlo da un istante all'altro, perdendo tempo sia in fase di creazione che di GC.
  2. Converti parole chiave in caratteri che corrispondono a lettere maiuscole e minuscole.
  3. Non sono necessari i dati acquisiti dalla stringa, quindi utilizzare string.find per la velocità.
  4. In base alla tua logica , se hai più di una corrispondenza, segnali "falso". Dal hai bisogno di una sola partita, non è necessario contarli. Basta restituire false non appena lo colpisci. Risparmia tempo per controllare tutte le parole rimanenti . Se in seguito decidi di volere più di una partita , è ancora meglio controllarla all'interno del loop e tornare non appena hai raggiunto il numero desiderato.
  5. Non utilizzare dispositivi di protezione. È più lento di un semplice ciclo da 1 a una lunghezza dell'array e gli ipairs sono comunque deprecati in Lua 5.2.

    local keyWords = {"word","test","blah","here","code","woot"} 
    local caselessKeyWordsPatterns = {} 
    
    local function letter_to_pattern(c) 
        return string.format("[%s%s]", string.lower(c), string.upper(c)) 
    end 
    
    for idx = 1, #keyWords do 
        caselessKeyWordsPatterns[idx] = string.gsub(keyWords[idx], "%a", letter_to_pattern) 
    end 
    
    local function wordFilter(self, event, msg) 
        for idx = 1, #caselessKeyWordsPatterns do 
         if (string.find(msg, caselessKeyWordsPatterns[idx])) then 
          return false 
         end 
        end 
        return true 
    end 
    
    local _ 
    print(wordFilter(_, _, 'omg wtf lol')) 
    print(wordFilter(_, _, 'word man')) 
    print(wordFilter(_, _, 'this is a tEsT')) 
    print(wordFilter(_, _, 'BlAh bLAH Blah')) 
    print(wordFilter(_, _, 'let me go')) 
    

risultato è:

true 
false 
false 
false 
true 
5

Uso if msg:lower():find (word:lower() , 1 , true) then

==> it minuscole entrambi gli argomenti string.find: quindi caso insensibilità. Inoltre ho usato string.find perché probabilmente vuoi l'opzione 'plain', che non esiste per string.match.

Inoltre è possibile tornare facilmente sulla prima parola trovata:

for _ , keyword in ipairs(keywords) do 
    if msg:lower():find(keyword:lower(), 1, true) then return true end 
end 
return false 
1

È possibile anche organizzare questo con metatables, in modo del tutto trasparente:

mt={__newindex=function(t,k,v) 
    if type(k)~='string' then 
     error'this table only takes string keys' 
    else 
     rawset(t,k:lower(),v) 
    end 
end, 
__index=function(t,k) 
    if type(k)~='string' then 
     error'this table only takes string keys' 
    else 
     return rawget(t,k:lower()) 
    end 
end} 

keywords=setmetatable({},mt) 
for idx,word in pairs{"word","test","blah","here","code","woot"} do 
    keywords[word]=idx; 
end 
for idx,word in ipairs{"Foo","HERE",'WooT'} do 
    local res=keywords[word] 
    if res then 
     print(("%s at index %d in given array matches index %d in keywords"):format(word,idx,keywords[word] or 0)) 
    else 
     print(word.." not found in keywords") 
    end 
end 

In questo modo la tavola può essere indicizzato in ogni caso. Se aggiungi nuove parole, verrà automaticamente minuscole. Puoi persino regolarlo per consentire la corrispondenza con i pattern o qualsiasi altra cosa desideri.

Problemi correlati