Вот наивная решение:
String input = "saya sedang makan nasi goreng";
Matcher m = Pattern.compile("[^aeiou]?[AEIOUaeiou](ng|n)?").matcher(input);
int s = 0;
while (m.find()) {
System.out.println(input.substring(s, m.end()).trim());
s = m.end();
}
Edit:
@Stephen C прав. Вот правильное решение, основанное на слог правил формирования индонезийского языка (от source)
В индонезийском слоге состоит из гласной плюс сразу precending согласными. Он также включает любой следующий согласный, что не сразу предшествует следующей гласной.
Отметьте, что ng считается единственным согласным.
String input = "SAYA sedang makan nasi goreng garam asal saat air ia bentuk";
Matcher m = Pattern.compile("[^aeiou]?[aeiou]((ng|[^aeiou])(?![aeiou]))?",
Pattern.CASE_INSENSITIVE).matcher(input);
int s = 0;
while (m.find()) {
System.out.println(input.substring(s, m.end()).trim());
s = m.end();
}
Пожалуйста, обратите внимание, что (также упоминается в приведенном выше источнике) слогов, как они выражены в речи может слегка отличаться, например, in-speech: ma-kan-a, программный выход: ma-ka-nan.
Редакция 2: ОК. Дальнейшее изучение показало, что я пропустил ny, sy и kh согласные. Также исправлена пара других проблем. Вот обновленное регулярное выражение:
"(ng|ny|sy|kh|[^aeiou])?[aeiou]((ng|ny|sy|kh|([^aeiou](?![gyh]))(?![aeiou])))?"
Я думаю, что это проблема определения формальных правил того, что составляет слог на индонезийском языке, а не проблемы программирования. После того, как вы определили формальные правила, программирование должно быть * тривиальным *. –
Хорошее место для запуска: http: // stackoverflow.com/questions/405161/detecting-syllables-in-a-word –
@KlausByskovHoffmann Программа * может быть тривиальной, но словарь, который ему нужен, может быть довольно большим :) – dasblinkenlight