代码之家  ›  专栏  ›  技术社区  ›  mike bayko

G在Lua中使用包含换行符的模式对字符串进行subbing

  •  4
  • mike bayko  · 技术社区  · 7 年前

    没有字符串。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一个字符串文字?

    谢谢

    1 回复  |  直到 7 年前
        1
  •  3
  •   IS4    7 年前

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

    在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