Возможно, вам лучше разбить список на компоненты и затем проверить каждый компонент:
hosts = 'foo.bar,foo.bar.baz,foo-bar.baz'
all_ok = true
hosts.split(/\s*,\s*/).each do |host|
all_ok = false unless(host =~ /[a-z\d\-.]+\.[a-z]+\z/i)
end
Возможно, это не однострочный текст, но, вероятно, через шесть месяцев его будет гораздо легче понять.дорога (если, конечно, ваше регулярное выражение не становится сильнее).