Вам не нужна замена
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, включая все непробельные символы перед ним или за ним. Не пробельные символы кодируются как %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)