Use a capturing group:
local s = "^#57df44;Cobblestone^white;"
res = s:match(";([^^]*)") or s
print( res )
-- Cobblestone
See the Lua demo.
Here,
; - matches the first ;
([^^]*) - Capturing group 1 matches any 0+ chars other than ^ into Group 1
The string.match will only return the captured part if the capturing group is defined in the pattern.
More details
As is mentioned in comments, you might use a frontier pattern %f[^:] instead of (?<=:) in the current scenario.
The frontier pattern %f followed by a set detects the transition from "not in set" to "in set".
However, the frontier pattern is not a good substitute for a positive lookbehind (?<=:) because the latter can deal with sequences of patterns, while a frontier pattern only works with single atoms. So, %f[^:] means place in string between : and a non-:. Howerver, once you need to match any 0+ chars other than ^ after city=, a frontier pattern would be a wrong construct to use. So, it is not that easily scalable as a string.match with a capturing group.
s = s:gsub("^.-;(.-)^.*$", "%1")