2

ある文字列のすべての出現箇所を別の文字列に置き換える関数を Lua で作成しようとしています。

function string.replace(s, oldValue, newValue)
   return string.gsub(s, oldValue, newValue);
end;

必要なのは (Lua に既に文字列置換機能がない限り)、Lua正規表現パターン文字列をエスケープする関数です (Lua に Escape RegularExpression Pattern 関数が既にない場合)

私は適切なstring.replace関数を書き始めようとしました:

local function EscapeRegularExpression(pattern)
    -- "." ==> "%."
    local s = string.gsub(pattern, "%." "%%%.");

    return s;
end;

function string.replace(s, oldValue, newValue)
    oldValue = EscapeRegularExpression(oldValue);
    newValue = EscapeRegularExpression(newValue);

    return string.gsub(s, oldValue, newValue);
end;

しかし、エスケープする必要があるすべての Lua正規表現パターン キーワードを簡単に思いつくことはできません。

ボーナスの例

修正が必要な別の例は次のとおりです。

//Remove any locale thousands separator:
s = string.gsub(s, Locale.Thousand, "");

//Replace any locale decimal marks with a period
s = string.gsub(s, Locale.Decimal, "%.");
4

2 に答える 2

3

私が使う

-- Inhibit Regular Expression magic characters ^$()%.[]*+-?)
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 -- function strPlainText
于 2012-09-03T07:30:08.847 に答える
1

パターンに関するドキュメント (Lua 5.1 の場合はセクション 5.4.1 ) を確認してください。最も興味深いのは魔法の文字のリストです。

x: (x は魔法の文字 ^$()%.[]*+-? の 1 つではありません) は、文字 x 自体を表します。

%string in を使用する前に、先行してそれらをエスケープしてgsubください。

さらに確実にするために、便利な「プレーン」フラグと文字列の必要な部分を手動で使用してwhileループを設定できます。string.findstring.sub

于 2012-09-02T15:15:57.550 に答える