In that case I'd consider two options.
Create the window once and then change its visibility.
Loose the reference to the window after you dispose it. I.e.
@my_window.dispose unless @my_window.disposed?
@my_window = nil
Be careful about using the greedy Kleene star.
Let me give you an example. Say you have the following regular expression: regex = /<name(.*)>/i
Sure it appears to work fine for your purpose, but let me show you what happens in a couple of cases:
'<name 1, 2, 7>' =~ regex #=> $1 = "1, 2, 7"
'<name 1><name 2><name7>' =~ regex #=> $1 = "1><name 2><name7"
'<name 1><type 5>' =~ regex #=> $1 = "1><type 5"
Remember that you scan for all the numbers in the resulting string which is ok for the first to cases, but if you have another tag on the same line then you'll get that along. Not really what you want. You can use a non-greedy approach, /<name(.*?)>/i, or use the greedy approach for all characters except >, i.e. /<name([^>]*)>/i. The trouble with using those two is the general approach that you only consider the first match rather than all matches for each line. You can do a scan like to you do for the digits.
Do note that I have not added a space after name unlike what you have after skill-types. If I had then it would not match "<name2>" as there are no space there.
Also, what happens if try to match against "<name>" or "<name garbage>"?
Special cases that you should consider. Maybe it makes sense, maybe not. Maybe you should require at least one number.
*hugs*