You can do this with a capture group, as @Doorknob has done, or without a capture group, by using a ("zero-width") positive look-behind and positive-lookahead:
tmp = "things <st>hello</st> and <st>blue</st> by <st>orange</st>"
s1 = "<st>"
s2 = "</st>"
tmp.scan(/(?<=#{ s1 }).*?(?=#{ s2 })/).flatten
#=> ["hello", "blue", "orange"]
(?<=#{ s1 }), which evaluates to (?<=<st>), is the positive look-behind.
(?=#{ s2 }), which evaluates to (?=</st>), is the positive look-behind.
? following .* makes it "non-greedy". Without it:
tmp.scan(/(?<=#{ s1 }).*(?=#{ s2 })/).flatten
#=> ["hello</st> and <st>blue</st> by <st>orange"]
XMLparser recommended for such a problem?