在Lua中使用包含换行符的模式替换字符串

字符串替换函数gsub是否能识别字符串内的换行符? 我正在尝试替换一个从操作符开始到换行符的字符串部分,如下所示:

local function removeComments(str, operator)
    local new_Sc = (str):gsub(operator..".*\n", "");
    return new_Sc;
end
local source = [[
int hi = 123; //一条基本注释
char ok = "abc"; //另一条注释
]];
source = removeComments(source, "//");
print(source);

但是我发现输出结果已经删除了第一条注释后面的所有字符串:

int hi = 123;

我试着使用实际的换行符来替换 string.char(10),如 (str):gsub(operator..".*"..string.char(10), "");,但是结果依然相同:它删除了注释以及注释后面的所有字符串,而不是从注释开始到换行符的位置。

那么有没有办法替换包含换行符的字符串呢?

谢谢

点赞
用户1424244
用户1424244

你面临的问题类似于正则表达式中的贪婪匹配与懒惰匹配(.*.*?)。

在 Lua 的模式匹配中,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
2017-08-01 23:57:43