高级Lua模式匹配

时间:2016-08-02 18:53:21

标签: regex lua pattern-matching

我想知道在Lua中是否可以使用这两种方案中的任何一种:

我有一个类似的字符串:some_value=averylongintegervalue

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

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

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

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

1 个答案:

答案 0 :(得分:3)

是的,您可以使用以下内容(%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建议)。