0

I'm trying to match and return a string between two (or one if there's no closing character, then until the string's end) character.

local id = "+@a-@s,@n";

local addOperator = string.match(id, "^[+](.+)(?[-])"); -- should return "@a"
if (addOperator) then 
   -- ...
end

local removeOperator = string.match(id, "^[-](.+)(?[+])"); -- should return "@s,@n"
if (removeOperator) then 
   -- ...
end 

-- Or without the excluding operator "-" 

local id = "+@a";

local addOperator = string.match(id, "^[+](.+)(?[-])"); -- should return "@a", with my pattern it returns a nil.
if (addOperator) then 
   -- ...
end
szkiddaj
  • 17
  • 4

1 Answers1

1

? should come after the char you are matching 0 to 1 of. You also can not use .+ followed by any char ? and expect the ? to restrict the results of the .+

I suggest using an a set that excludes -. Additionally you use [+] but should be using %+, % is how you escape a special character in a pattern. Using [+] to escape is not necessarily wrong functionally it just comes off as odd or non-idiomatic in Lua.

local id = "+@a-@s,@n"
print(string.match(id, "^%+([^-]+)"))
print(string.match(id, "%-(.+)"))

id = "+@a"
print(string.match(id, "^%+([^-]+)"))

This is a good resource for understanding Lua patters: Understanding Lua Patterns

Nifim
  • 4,758
  • 2
  • 12
  • 31