你不需要替换
string.gsub 是一个替换字符串中某些内容的函数。这就是为什么10 出现在您的结果中的原因。
顺便说一句,你用一个litteral替换你找到的东西,但你也可以在替换中包含你找到的东西。
print(str:gsub("[%a[x]%a*]?", '<%0>')) --> <exp>(<x>) 2
2 表示找到了两个结果。
如果您不熟悉返回多个结果的函数,read this
你需要string.find 才能找到东西。这个函数返回它找到的开始和结束位置,但你也可以让它返回第三个值:它找到的文本,通过将你的模式括在括号中。
print(str:find("[%a[x]%a*]?")) --> 1 2 exp
你的模式是错误的。
说实话,我不明白您的模式是如何工作的,但搜索字符串中通常不需要方括号。
假设您正在寻找来自Try exp(x) out 的字符串,您只需要exp(x),您正在寻找任何x,包括它前面或后面的所有非空白字符。非空白字符编码为%S,两边需要0个或多个,所以
str = "exp(x)"
print(str:find("(%S*x%S*)")) --> 1 6 exp(x)
str = "Try exp(x) out"
print(str:find("(%S*x%S*)")) --> 5 10 exp(x)
一次性完成所有任务
使用内联函数
newStr = (function(oldStr)
from, till, found = (oldStr):find("(%S*x%S*)")
return found
end)(str)
有关 lua 模式的更多信息
read about patterns in lua,或者自己试试这个
s = "Deadline is 30/05/1999, firm"
date = "%d%d/%d%d/%d%d%d%d"
print(string.sub(s, string.find(s, date))) --> 30/05/1999
print()
for patrnNr, patrn in pairs{
"[%a[x]%a]?",
"[%a[x]%a*]?",
"([%a[x]%a*]?)",
"(%a*x%a*)",
"(.+x.*)",
"(%S*x%S*)"}
do
for strNr, str in pairs{
"Try exp(x) out",
"Try exp(y) out",
"Try sin(x) out",
"Try sin(y) out",
"Try exp out",
"Try x y z out",
"Try xy wx out"}
do
print(patrn, str, str:gsub(patrn, '<%0>'), str:find(patrn))
end
end
print()
print(("Try exp(x) out"):gsub("[%a[x]%a*]?", '<%0>')) --> <Try> <exp>(<x>) <out> 4
print(("Try exp(x) out"):find("(%S*x%S*)")) --> 5 10 exp(x)