string.gsub是否识别字符串文字中的换行符?我有一个场景,我试图将一个给定运算符指示的字符串的一部分从运算符的开头到新行,如下所示:
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;
我尝试使用string.char(10)
像(str):gsub(operator..".*"..string.char(10), "");
一样使用文字换行符但是我仍然得到相同的输出;它删除了注释和字符串的其余部分,而不是删除注释的开头。
无论如何,gsub包含换行符的模式的字符串文字?
由于
答案 0 :(得分:2)
您遇到的问题类似于正则表达式中的贪婪与懒惰匹配(.*
vs .*?
)。
在Lua模式中,X.*\n
表示"匹配X,然后匹配尽可能多的字符,后跟换行符"。 gsub
对换行没有特殊处理,因此它会尝试继续匹配,直到 last 换行符为止,尽可能多地填充字符。您希望匹配尽可能少的字符,在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