所以我想在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"
我不确定这些为什么不起作用,我几乎肯定有一个正则表达式。任何帮助将不胜感激。
答案 0 :(得分:1)
string.gsub
是用于替换字符串中某些内容的函数。这就是在您的结果中出现10
的原因。
顺便说一句,您可以用乱扔垃圾代替发现的东西,但是也可以包含在替换物中发现的东西。
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)
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)