【发布时间】:2014-11-15 19:08:18
【问题描述】:
我正在开发一个图形计算器程序。我有一个显示 'y=' 函数的图表。
如果找到诸如“x * 5”之类的模式(其中 x 乘以某个值,但先给出 x),我想用 5x 替换它。这是我目前拥有的。
local func = "x * 5"
print(func:gsub("%*", ""):gsub(" ", ""):gsub("x%d+", "%d+x"))
--[[
get rid of the '*' symbol, get rid of spaces, then
replace x(digit) with (digit)x
EXPECTED OUTPUT: 5x, OUTPUT: d+x
]]
我在想我可能可以使用 string.reverse 函数,但我不知道如何处理这个问题。有人可以帮忙吗?
更新:这就是我现在所拥有的。它正在输出“2x.5”
local func = "x * 5"
print(func:gsub("%*", ""):gsub(" ", ""):gsub("x%d+", function(match) return match:sub(2) .. match:sub(1, 1))
【问题讨论】:
-
string.reverse将适用于这种简单的情况。它不适用于x * 2.5。那里的gsub调用需要捕获模式中的数字并在替换中使用模式引用。 -
啊,我明白你的意思了。我该怎么做呢?
-
:gsub("x([%d.]+)", "%1x")但至少在那个 sn-p 中,你也没有确保你的输入是你期望的格式。gsub链对2x + 5或x * y没有多大用处。 -
很遗憾地说(因为它不像您希望做的那么简单)但是您确实需要编写一个解析器语法,也许使用 LPeg。
-
我实际上想出了一个简单的方法来做到这一点。而不是解析函数来显示它(基本上从 5 * x 到 5x),我决定做完全相反的事情。我这样做是为了让您可以在函数中输入 3x,脚本会将其转换为 3 * x,然后使用 loadstring 执行它。感谢您的帮助。