Правилa не работают сами по отдельности:
while(part.length) {
if(slab = part.match(Regulars[0])) { // Правило №1
seps.push(slab[0]);
part = part.substr(slab[0].length);
} else
if(slab = part.match(Regulars[1])) { // Правила №2 и №3
if(next = part.substr(slab[0].length).match(Regulars[2]))
slab[0] += next[1];
seps.push(slab[0]);
part = part.substr(slab[0].length);
} else
if(slab = part.match(Regulars[3])) { // Правило №4
if(slab[0].length > 1 && part.charAt(slab[0].length).match(/[аеёиоуыэюя]/i))
slab[0] = slab[0].substr(0, slab[0].length - 1);
seps.push(slab[0]);
part = part.substr(slab[0].length);
} else {
seps.push(part);
part = "";
}
}
Види е здесь каскад условий, где все правила используются в комплексе?
Их я вынес из тела программы в INPUT-поля, чтобы можно было отладить и, добившись реально гораздо лучшего результата, вставить назад в тело алгоритма.
(
Однако, эксперименты показали, что первоначальный исходный свод правил, хоть не идеальный, но редактированием мало что улучшает.)
Сам алгоритм, как можно видеть, практически никакой: Там просто идёт срабатывание одного из трёх правил (№1, №2 и №4) и одного подправила (№3 - №2.1).
Есть ещё подправило №4.1, но там одни гласные и его редактировать бессмысленно.
Сравните тела условий правил №2 и №4: Они практически одинаковы.
То есть, Вы сами можете удлинить цепь условий и добавить ещё больше правил.
(Я обошёлся именно тремя звеньями, так как это, ИМХО, оптимально в данной логике)
P.S.: Как выше я говорил, не плохо было бы добавить разбор суффиксов и окончаний (как и приставок, их ограниченное множество и в несколько регулярок вместить можно) перед данным циклом.
(Но в результате, лично я, сомневаюсь и не стал усложнять свою функцию.)