Если соответствующего совпадения нету, иногда появляется такой эффект, как регексп ищется, ищется, ищется и т.д. даже nil не возвращается.
Например такой кусок текста. Прозреваю, что это из-за того, что он нулевые совпадения куда-то фигачит в астрономических количествах, потому что если поправить ((,?[ ]+)|)) на явное совпадение ((,?[ ]+)|(?=[.]))) , то всё начинает работать моментально.
text = "Firsthand the barbarians, those near-legendary."
puts "match" if text =~ /\A(([A-z]+)((,?[ ]+)|))+[.]/
От чего получается эффект бесконечного поиска?