I am new to Lua, and hardly understand pattern matching. I am trying to figure out how to match everything in a string after a colon, and put that portion of the string into a variable. I haven't had much luck by looking around online, or maybe I am just not seeing it. So how would I do this?
For example, say I have a variable called my_string
that is equal to "hello:hi_there"
or something like that. How can I extract "hi_there"
to a another variable without changing my_string
?
It looks like I would need to use string.match()
, but what pattern would be used to achieve my goal?
> = string. match("foo 123 bar", '%d%d%d') -- %d matches a digit 123 > = string. match("text with an Uppercase letter", '%u') -- %u matches an uppercase letter U. Making the letter after the % uppercase inverts the class, so %D will match all non-digit characters.
The % is also used to designate a character class in the pattern syntax used with some string functions. Show activity on this post. Lua uses %s in patterns (Lua's version of regular expressions) to mean "whitespace". %s+ means "one or more whitespace characters".
gsub() function has three arguments, the first is the subject string, in which we are trying to replace a substring to another substring, the second argument is the pattern that we want to replace in the given string, and the third argument is the string from which we want to replace the pattern.
Valid in Lua, where %w is (almost) the equivalent of \w in other languages. ^[%w-.]+$ means match a string that is entirely composed of alphanumeric characters (letters and digits), dashes or dots.
You can achieve that by doing something like this:
local my_string = "hello:hi_there"
local extracted = string.match(my_string, ":(.*)")
print(extracted)
The parentheses do a pattern capture, the dot means any character and the star tells the match function that the pattern should be repeated 0 or more times. It starts matching at the :
and takes everything until the end of the string.
Because you don't want the :
to be in the selection, I would combine string.find()
and string.sub()
in the following implementation:
local string = "hello:hi_there"
beg, final = string.find(string, ":") # Returns the index
local new_string = string.sub(string, final + 1) # Takes the position after the colon
According to the documentation, if you left sub()'s third argument blank, it defaults to -1, so it takes all the remaining string.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With