I am putting some strings inside a table for use with string.find
, string.gsub
, and possibly some others.
What I want to do is stop the strings from being patterns (the strings I am working with are emotes).
How would I go about this? Is here a certain prefix that you put in front of the string?
Thank you!
~TDP
You can use %
to "escape" any of the special characters and mean the literal character you write. For example, the search pattern "cat%-dog"
matches the string "cat-dog"
instead of "catttdog"
(on a related note, in order to match a literal %
you need to use the pattern "%%"
)
In general, I think you can automatically process patterns like [EDITED to fix replacement]
(pattern:gsub("([^%a%d])", "%%%1"))
to escape all characters in them, though there may be an edge case I'm not remembering. That parenthesis in this case may be significant.
The letters and numbers become special when you put a %
, while the special punctuation becomes unspecial, and all of the others remain the same.
From the function dump, string.find
has a fourth parameter, plain
, which is whether or not to use patterns (as opposed to just using the plain string).
Thus text:find("cat-dog", 1, true)
will find the literal string "cat-dog"
instead of "catttdog"
.
As far as I know, there is not a similar plain
parameter for these two. You will unfortunately have to manually escape the patterns or manually implement the searches.
Luckily :match
is essentially identical to :find
when you don't use patterns, since the returned string will just be what you're searching for. gmatch
is also very similar, since the only extra information it gives is how many matches have been found.
If you have something like :(
, the parenthesis is special, so you want to put a %
before it: :%(
. The colon isn't special, but Lua will just ignore %
before punctuation that aren't special -- this makes it easier on you since you don't have to remember. So a pattern for :(
could either be %:%(
or :%(
.
For :)
, the right parenthesis is sometimes special (only if there was a (
before it) so ":)"
should work as a string pattern, but to be safe you can write it at "%:%)"
or ":%)"
.
Using the global-substitution I included earlier is a magic box that can do this automatically for you:
function escape(pattern) return (pattern:gsub("([^%a%d])", "%%%1")) -- (these parens aren't a mistake and are intentional) end smiley = escape(":)") frowny = escape(":(") -- etc