【问题标题】:Lua Pattern Matching, get character before matchLua模式匹配,匹配前获取字符
【发布时间】:2016-08-10 16:55:16
【问题描述】:

目前我的代码如下所示:

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

StringToPrint 将如下所示:

param=hello&456

我已将& 之前的所有字符替换为字符串“hello”。这就是我的问题变得有点奇怪和具体的地方。

我希望我的字符串显示为:param=helloZ&456。换句话说,我想在用hello 替换字符串valueZ 以使其改为helloZ 时保留& 之前的字符。如何做到这一点?

【问题讨论】:

  • "param=valueZ&param=456" 的预期输出是什么?或者这不可能发生?试试somestring:gsub("(param=)[^&]+([^&])", "%1hello%2", 1),见ideone.com/pHRgAT

标签: lua pattern-matching


【解决方案1】:

我建议:

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

Lua demo

这里,模式匹配:

  • param= - 文字子字符串 param=
  • [^&]* - 除了& 之外,尽可能多的 0 个或更多字符
  • ([^&]) - 第 1 组捕获除 & 之外的符号(此处将发生回溯,因为前一个模式会捕获除 & 之外的所有此类字符,然后引擎将后退一步并从中放置最后一个字符分块到第 1 组)。

【讨论】:

  • 假设是:param=a&xyz?
  • @WiktorStribiżew 您的演示有效,但建议在参数周围有(),因此它不起作用
  • @Rochet2:我忘了删除冗余组。现已删除。我认为如果匹配文字字符串,则不需要添加捕获开销。
  • 两种解决方案都适用于这种情况,但正如@hjpotter92 所建议的,它不适用于param=a&xyz(如果valueZ 被替换为带有一两个字符的某个值)
  • @kshah:我实际上看到param=a&xyz(哈利波特)和你的param=valueZ&456之间的区别只是&之前的字符数。如果您需要从第一个获取param=helloa&xyz,则需要在我的模式中将+ 替换为*"param=[^&]*([^&])"
【解决方案2】:

可能还有其他方法可以做到这一点,但这里有一个:

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

这里的事情是我匹配以非 & 字符和 & 字符结尾的最短字符串。然后我将两个结束字符添加到替换的部分。

【讨论】:

  • 谢谢!只是好奇,如果我们想替换字符串末尾之前的所有内容(例如 param=valueZparam=helloZ)而不是第一个 & 字符之前,你会怎么做呢
  • @kshah 你的意思是"(param=).+(.)"
  • 两种解决方案都适用于这种情况,但正如@hjpotter92 所建议的,它不适用于param=a&xyz(如果valueZ 被替换为带有一个或两个字符的某个值)
猜你喜欢
  • 1970-01-01
  • 2013-01-19
  • 2018-03-11
  • 2021-06-07
  • 2011-03-29
  • 1970-01-01
  • 1970-01-01
  • 2019-03-29
  • 1970-01-01
相关资源
最近更新 更多