3

文字列解析で小さなブロックをヒットしました。次のような文字列があります。

footage/down/temp/cars_[100]_upper/cars_[100]_upper.exr

gsub を使用して文字列の一部を削除するのに苦労しています。通常、私はこれを行います

lineA = footage/down/temp/cars_[100]_upper/cars_[100]_upper.exr
lineB = footage/down/temp/cars_[100]_upper/
newline = lineA:gsub(lineB, "")

通常、「cars_[100]_upper.exr」が表示されます

問題は、gsub が文字列内の [] やその他の特殊文字を好まず、string.find とは異なり、gsub には「plain」フラグを使用してパターン検索をキャンセルするオプションがないことです。

ファイル比較スクリプトを実行しているため、行を手動で編集して特殊文字のエスケープ文字を含めることができません。

lineAnewline を使用して取得するための助けをlineBいただければ幸いです。

4

3 に答える 3

8

Programming in Lua 2e の 181 ページからの抜粋:

魔法のキャラクターは次のとおりです。

( ) . % + - * ? [ ] ^ $

文字「%」は、これらの魔法の文字のエスケープとして機能します。

したがって、これらの魔法の文字をエスケープする単純な関数を考え出し、それを入力文字列 ( lineB)に適用することができます。

function literalize(str)
    return str:gsub("[%(%)%.%%%+%-%*%?%[%]%^%$]", function(c) return "%" .. c end)
end

lineA = "footage/down/temp/cars_[100]_upper/cars_[100]_upper.exr"

lineB = literalize("footage/down/temp/cars_[100]_upper/")

newline = lineA:gsub(lineB, "")

print(newline)

もちろん、どちらが印刷されますか: cars_[100]_upper.exr.

于 2009-11-17T03:53:48.880 に答える
4

次のような別のアプローチを使用できます。

local i1, i2 = lineA:find(lineB, nil, true)
local result = lineA:sub(i2 + 1)
于 2009-11-16T23:25:41.350 に答える
2

以下を使用して、テキスト文字列 str の句読点をエスケープすることもできます。

str:gsub ("%p", "%%%0")

于 2012-11-19T13:25:43.083 に答える