Lua模式匹配,获取匹配前的字符

目前我有以下代码:

somestring = "param=valueZ&456"
local stringToPrint = (somestring):gsub("(param=)[^&]+", "%1hello", 1)

StringToPrint将会是这样的:

param=hello&456

我已经用字符串"hello"替换了&前面的所有字符。这时我的问题变得有些奇怪和具体。

我希望我的字符串仍然是:param=helloZ&456。换句话说,我希望在用hello替换字符串valueZ使它变成helloZ时,能保留&前面的字符。如何实现?

点赞
用户3586583
用户3586583

可能还有其他的方法来完成这个任务,但是下面是其中一种:

somestring = "param=valueZ&456"
local stringToPrint = (somestring):gsub("(param=).-([^&]&)", "%1hello%2", 1)
print(stringToPrint)

这里的关键在于我匹配的是以不是&且后面跟着一个&的最短字符串。然后我在替代部分后添加了这两个结尾字符。

2016-08-10 17:13:39
用户3832970
用户3832970

我建议:

somestring:gsub("param=[^&]*([^&])", "param=hello%1", 1)

请参阅Lua演示

在此,模式匹配:

  • param= - 字面子字符串 param=
  • [^&]* - 除了 & 以外的 0 或更多个字符,尽可能多
  • ([^&]) - 捕获一个除 & 以外的符号的第一组(在这里,回溯将发生,因为前面的模式会抓住所有这样的 & 以外的字符,然后引擎会向后退一步,并将该块中的最后一个字符放入第一组)。
2016-08-10 18:07:49