I am currently working on a project that requires me to use string manipulation in order to accomplish the goals. One issue I have run into deals with finding certain items in a string while ignoring others. In an effort to do this I am implementing string.gsub() in order to replace the pattern I want to ignore with "substitute" or something similar. The issue is that I want to save what I am replacing with "substitute" for an operation in the future. I thought about using string.find() and string.match() but I don't know how well those will be able to work with the system I am implementing. Here is an example of what I am attempting to do. Input: "3x^2+2x^5-sec(3x+4x)" Parser result: "3x^2+2x^5-substitute" and have a variable that has the value of substitute. Here is my parser so far with no values being returned:
local function parseString(input)
local s = input:gsub("%(([^()]+)%)", "substitute") -- here is what I don't know how to do
local str -- this is if there is no symbol
local firstString -- this is for before the symbol found
local secondString -- this is for after the symbol found
local plus = string.find(s, "+")
local minus = string.find(s, "-")
if plus and minus then
if minus > plus then
firstString = s:sub(1, plus)
local nextPlus = string.find(s, "+", plus)
local nextMinus = string.find(s, "-", plus)
if nextPlus and nextMinus then
if nextMinus > nextPlus then
secondString = s:sub(plus, nextPlus)
else
secondString = s:sub(plus, nextMinus)
end
elseif nextPlus then
secondString = s:sub(plus, nextPlus)
elseif nextMinus then
secondString = s:sub(plus, nextMinus)
else
secondString = s:sub(plus)
end
else
firstString = s:sub(1, minus)
local nextPlus = string.find(s, "+", minus)
local nextMinus = string.find(s, "-", minus)
if nextPlus and nextMinus then
if nextMinus > nextPlus then
secondString = s:sub(minus, nextPlus)
else
secondString = s:sub(minus, nextMinus)
end
elseif nextPlus then
secondString = s:sub(minus, nextPlus)
elseif nextMinus then
secondString = s:sub(minus, nextMinus)
else
secondString = s:sub(minus)
end
end
elseif plus then
firstString = s:sub(1, plus)
local nextPlus = string.find(s, "+", plus)
if nextPlus then
secondString = s:sub(plus, nextPlus)
else
secondString = s:sub(plus)
end
elseif minus then
firstString = s:sub(1, minus)
local nextMinus = string.find(s, "-", minus)
if nextMinus then
secondString = s:sub(minus, nextMinus)
else
secondString = s:sub(minus)
end
else
str = s
end
end
I will deal with what the parser returns and how it recursively works later. I appreciate any help. Thanks!
