2017-08-01 30 views
2

string.gsubは文字列リテラルの改行文字を認識しますか?私はそうのような改行にオペレータの開始から与えられたオペレータによって示された文字列の部分をGSUBしようとしていたシナリオを持っている:Luaの改行文字を含むパターンを含む文字列をgububbing

local function removeComments(str, operator) 
    local new_Sc = (str):gsub(operator..".*\n", ""); 
    return new_Sc; 
end 
local source = [[ 
int hi = 123; //a basic comment 
char ok = "abc"; //another comment 
]]; 
source = removeComments(source, "//"); 
print(source); 

しかし出力に私はそれが削除されたことを見ます最初のコメントの後に文字列リテラルの残り:

int hi = 123; 

が、私はそう(str):gsub(operator..".*"..string.char(10), "");ようstring.char(10)を使用してリテラルの改行文字を使用してみましたが、しかし私はまだ同じ出力を得ました。改行のコメントの先頭ではなく、コメントと残りの文字列を削除します。

改行文字を含むパターンの文字列リテラルをgsubするにはどうしますか?

おかげ

答えて

2

は、あなたが直面している問題は、正規表現(.*?.*)で怠惰なマッチング対貪欲に似ています。

ルアパターンでは、X.*\nは「Xと一致し、可能な限り多くの文字と改行が続く」ことを意味します。 gsubには改行の特別な処理がないため、最後の改行まで一致を継続しようとします。できるだけ多くの文字に下書きします。可能な限り少数の文字を一致させたい場合は、Luaパターンで.-で表されます。

また、意図しているかどうかはわかりませんが、改行で(正しく)終了していない場合は、最後の行からコメントを削除しません。単一のパターンで表現できるかどうかはわかりませんが、この関数はすべての行からコメントを削除します:

local function removeComments(str, operator) 
    local new_Sc = str:gsub(operator..".-\n", "\n"); 
    new_Sc = new_Sc:gsub(operator.."[^\n].*$", ""); 
    return new_Sc; 
end 
関連する問題