Луа соответствует 16 длинному гексу с префиксом - PullRequest
0 голосов
/ 28 сентября 2018

Допустим, у меня есть строка /url/ID0123456789abcdef/bar.Я хочу найти и / или заменить ID0123456789abcdef.Этот идентификатор всегда имеет форму 2 алфавитов, за которыми следует 16 гекса.

Это то, что я сделал, и не уверен, что это лучшее решение:

function replace_id(str, prefix, replace)
    local first, last = str:find(prefix)
    if first == nil then
        return str
    end

    local hex = str:sub(last - 1, last + 16)
    if not is_hex(hex) then
        return str
    end

    return replace_id(str:gsub(hex, replace), prefix, replace)
end

function utils.is_hex(str)
    if utils.is_str_empty(str) then
        return false
    end

    -- String is alphanumeric and hex
    return str:gsub('%a', ''):gsub('%d', '') == '' and str:gsub('%x', '') == ''
end

print(replace_id('/url/ID0123456789abcdef/bar', 'ID', 'REPLACED'))
-- Prints '/url/REPLACED/bar'

Есть ли лучший способ?

1 Ответ

0 голосов
/ 28 сентября 2018

Вы делаете вещи намного сложнее, чем нужно.

Один вызов string.gsub() делает то, что вы хотите, и все, что вам нужно сделать, это построить шаблон для того, что вы хотите сопоставить, чтоэто очень просто.

Единственное, что нужно учитывать, если вы хотите построить шаблон, содержащий магические символы, такие как % или ., вам придется сначала их избежать,это тоже не сложно, но, похоже, это не относится к вашему делу, так как ваш префикс состоит только из буквенных символов.

function foo(str, prefix, replacement)
  return str:gsub(prefix..string.rep("%x", 16), replacement)
end

Это должно делать то, что вы хотите, просто отлично.

string.rep("%x", 16), как следует из названия, повторяет строку 16 раз, создавая шаблон Lua, который соответствует 16 шестнадцатеричным цифрам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...