【问题标题】:Advanced Lua Pattern Matching高级 Lua 模式匹配
【发布时间】:2016-08-02 18:53:20
【问题描述】:

我想知道这两种情况中的任何一种/两种在 Lua 中是否可行:

我有一个看起来像这样的字符串:some_value=averylongintegervalue

假设我知道字符串中的 = 符号后面正好有 21 个字符,有没有一种简单的方法可以用我自己的字符串替换字符串 averylongintegervalue? (即比输入更简单的方法:string.gsub("some_value=averylongintegervalue", "some_value=.....................", "some_value=anewintegervalue")

假设我们将原始字符串编辑为如下所示:some_value=averylongintegervalue&

假设我们不知道= 符号后面有多少个字符,有没有办法替换some_value=& 之间的字符串?

我知道这是一个奇怪的具体问题,但我经常发现自己需要使用正则表达式执行类似的任务,并且想知道如何在 Lua 中使用模式匹配来完成。

【问题讨论】:

    标签: regex lua pattern-matching


    【解决方案1】:

    是的,您可以使用类似以下的内容(%1 指的是模式中的第一个捕获,在这种情况下捕获 some_value=):

    local str = ("some_value=averylongintegervalue"):gsub("(some_value=)[^&]+", "%1replaced")
    

    这应该分配some_value=replaced

    你知道是否也可以用重复的单个字符替换 = 和 & 之间的每个字符(例如重复 21 次的 * 符号而不是像替换一样的常量字符串)?

    可以,但是需要用到函数:

    local str = ("some_value=averylongintegervalue")
      :gsub("(some_value=)([^&]+)", function(a,b) return a..("#"):rep(#b) end)
    

    这将分配some_value=#####################。如果您需要将其限制为仅一个替换,则将 ,1 添加为 gsub 的最后一个参数(正如 Wiktor 在评论中建议的那样)。

    【讨论】:

    • 我觉得还可以,但是这里好像应该有一个替换,所以可以将limit参数1传递给gsub
    • 哦,太好了,谢谢!你知道是否也可以用重复的单个字符替换=&之间的每个字符(例如重复21次的*符号而不是像replaced这样的常量字符串)?
    猜你喜欢
    • 1970-01-01
    • 2013-01-19
    • 2020-08-05
    • 1970-01-01
    • 2019-03-29
    • 2020-09-06
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    相关资源
    最近更新 更多