2012-04-19 13 views
5

Tôi có tập lệnh thay thế tìm kiếm hoạt động để thay thế chuỗi. Nó đã có các tùy chọn để thực hiện các tìm kiếm phân biệt chữ hoa chữ thường và các kết quả "thoát" (ví dụ: cho phép tìm kiếm% (v.v. trong tìm kiếm.Sử dụng string.gsub để thay thế chuỗi, nhưng chỉ toàn bộ các từ

Làm thế nào bây giờ tôi được yêu cầu khớp toàn bộ từ, tôi đã thử thêm% s vào mỗi đầu, nhưng điều đó không khớp với các từ ở cuối chuỗi và sau đó tôi không thể tìm ra cách để bẫy các mục không gian trắng được tìm thấy để nguyên vẹn chúng trong khi thay thế. tập lệnh bằng cách sử dụng string.find và thêm logic cho việc kiểm tra từ hoặc điều này có thể với mẫu.

Hai chức năng tôi sử dụng cho các mục không phân biệt chữ hoa và chữ thường như sau đều trả về mẫu để tìm kiếm.

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

Tôi có cách làm những gì tôi muốn ngay bây giờ, nhưng nó không phù hợp. Có cách nào tốt hơn?

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 

Trả lời

3

có cách làm những gì tôi muốn ngay bây giờ, nhưng nó không phù hợp. Có cách nào tốt hơn?

Có một tính năng không có giấy tờ của phù hợp với thư viện mẫu Lua của gọi là Frontier Pattern, mà sẽ cho phép bạn viết một cái gì đó như thế này:

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

bạn có nghĩa là nếu bạn vượt qua nocase() foo, bạn muốn [fooFOO] thay vì [fF] [oO] [oO]? nếu vậy, bạn có thể thử điều này?

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 

và nếu bạn muốn một cách dễ dàng để chia một câu diễn tả bằng lời, bạn có thể sử dụng này:

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

một khi bạn đã nhận được những lời chia tay, đó là khá dễ dàng để lặp qua các từ trong bảng và so sánh đầy đủ với từng từ.

+0

Không những gì tôi cần làm là sử dụng chuỗi tìm kiếm xử lý tôi có bây giờ hoặc biến thể và làm cho nó chỉ khớp với toàn bộ từ, vì vậy tôi tìm kiếm "đường phố" và nó sẽ chỉ khớp với "đường phố" chứ không phải "broadstreet" –

+0

bạn đang sử dụng các giá trị bạn nhận được từ nocase() và strPlainText() như thế nào ? điều đó liên quan nhiều hơn ... –

Các vấn đề liên quan