У меня есть скрипт замены поиска, который работает для замены строк. У него уже есть опции для поиска без учета регистра и «экранированных» совпадений (, например, позволяет искать % (и т. д. в поиске.
Когда-либо меня теперь просили сопоставлять только целые слова, я пробовал добавлять %s к каждому концу, но это не соответствует словам в конце строки, и я не могу понять, как перехватывать для найденные элементы белого-пространства оставили их нетронутыми во время замены.
Нужно ли переделывать скрипт с помощью string.find и добавлять логику для проверки слов или это возможно с шаблонами.
Две функции, которые я использую для нечувствительных к регистру и экранированных элементов, следующие: обе возвращают шаблон для поиска.
-- 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
У меня есть способ делать то, что я хочу сейчас, но это неэлегантно. Есть ли способ лучше?
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