因此,我在lua中要实现的目标是一个字符串模式,它可以检查某个字符(鉴于其在字符串中的位置(是否是单词的一部分。例如,说我有字符串:
str = "exp(x)"
我要实现的是找到一个字符串模式,当我运行以下代码时:
do
local newStr = str:gsub(STRING-PATTERN, 10)
print(newStr)
end
它正确打印出来:
"exp(10)"
而不是:
"e10p(10)"
到目前为止,我已经尝试过一些,但没有一个真正起作用。以下是我尝试过的一些示例:
string-pattern =" [%a [x]%a]?"
"exp(-10"
string-pattern =" [%a [x]%a*]?"
"e10p1010"
我不确定为什么它们不起作用,而且我几乎是肯定的,有一个正则表达式。任何帮助将不胜感激。
您不需要替代
string.gsub
是在字符串中替换某些东西的函数。这就是为什么10
发生在您的结果中的原因。顺便说一句,您替换了用插图所发现的东西,但是您也可以包括您在替换中发现的东西。
print(str:gsub("[%a[x]%a*]?", '<%0>')) --> <exp>(<x>) 2
2
表示它找到了两个结果。
如果您不熟悉返回多个结果的功能,请阅读此
您需要string.find
才能找到一些东西。此功能返回发现的内容的开始和结束位置,但是您还可以使其返回第三个值:找到的文本,通过将您的模式包装在括号中。
print(str:find("[%a[x]%a*]?")) --> 1 2 exp
您的模式是错误的。
说实话,我不明白您的模式是如何工作的,但是通常在搜索字符串中不需要方括号。
假设您正在寻找Try exp(x) out
中的字符串,您只需要exp(x)
,您正在寻找任何X,其中包括前面OD或后面的所有非白色空间字符。非白空间字符被编码为 %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模式的更多信息
阅读有关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)