Замените первый гласный в каждом слове правилом соответствия регулярному выражению - PullRequest
0 голосов
/ 02 мая 2018

Я хочу изменить каждый гласный слов в предложении на какой-нибудь арабский юникод. У меня есть вход как

each vocal of letter each word in a sentence change into unicode use substring on java

с правилом замены подстроки

String[][] replacements1 = {
           {"a", "\u0627"}, 
           {"i", "\u0627\u064A"},
           {"u", "\u0627\u0648"},
           {"e", "\u0627\u064A"},
           {"o", "\u0627\u0648"} }

Я использовал пробел, разбитый на массив с .split(" "), но это не сработало. Я перешел на использование charAt(), но, поскольку это больше 1 символа или строки, мне нужно использовать некоторое регулярное выражение для определения каждого индекса 0 для подстроки replacement[][], не затрагивая другой гласный в слове. Как я могу это сделать?

Вывод должен быть таким:

\u0627\u064Aach vocal \u0627\u0648f letter \u0627\u064Aach word \u0627\u064An \u0627 sentence change \u0627\u064Anto unicode \u0627\u0648se substring \u0627\u0648n java"

1 Ответ

0 голосов
/ 02 мая 2018

Используйте Matcher, чтобы найти все первые гласные в каждом слове на основе регулярного выражения "\\b([^aeiou]*)([aeiou])(\\w*)\\b" (которое также охватывает другие части слова).

Используйте API, предоставленный Matcher, чтобы упростить создание замененной строки.

String str = "each vocal of letter each word in a sentence change into unicode use substring on java";

Map<String, String> replacements = new HashMap<String, String>() {{
    put("a", "\u0627");
    put("i", "\u0627\u064A");
    put("u", "\u0627\u0648");
    put("e", "\u0627\u064A");
    put("o", "\u0627\u0648");
}};

Pattern pattern = Pattern.compile("(?i)(.*?)\\b([^aeiou]*)([aeiou])(\\w*)\\b");
Matcher matcher = pattern.matcher(str);
StringBuffer buf = new StringBuffer();
while(matcher.find()) {
    matcher.appendReplacement(buf, "$1$2" + replacements.get(matcher.group(3)) + "$4");
}
matcher.appendTail(buf);
String replaced = buf.toString();

Приведенный выше код был протестирован и дает желаемый результат.


Кстати, я удалил обратную косую черту из строк замены, чтобы избежать вставки арабских символов, чтобы я мог увидеть , что логика работала, так как трудно увидеть, что происходит при печати смеси справа налево и символы слева направо).

...