Есть ли шанс, что это задание (ката на кодовых войнах) может быть выполнено как декларативное программирование? - PullRequest
0 голосов
/ 07 декабря 2018

Недавно я решил купить поваренную книгу regex от Jan Goyvaerts и Steven Levithan и выучить ее, потому что я новичок в Java, и регулярные выражения для меня - настоящий ад.Чтобы немного попрактиковаться, я взял задачу, которая помечена как «Декларативное программирование» и «Регулярные выражения» на Codewars:

Напишите функцию, которая принимает строку и заменяет все гласные [a,e, i, o, u] с соответствующими позициями в этой строке.

От 6 до 8 часов чтения книги и попытки достичь результата ни к чему не привели, поэтому я открыл для себя публичные решения.Угадайте, что я нашел?Большинство проголосовавших решений были простыми и понятными

for i=0 to str.length-1
if the letter with index i is vowel, replace it

Это «Декларативное программирование» и «Regex»?

В информатике декларативное программирование - это парадигма программирования - стильпостроение структуры и элементов компьютерных программ, которые выражают логику вычислений без описания потока управления.(Wiki)

Я что-то упустил?Я попробовал Pattern, Matcher и regex, но из-за недостатка опыта ничего не вышло, в основном потому, что indexOf() не может принять регулярное выражение в качестве параметра, который является "(?i)[aeiou]".
Ссылка на задачу наКодовые войны, если необходимо

ОБНОВЛЕНИЕ: Возможно, даже "(? I) [aeiou] {1}" или что-то в этом роде.

1 Ответ

0 голосов
/ 07 декабря 2018

Это было бы решением регулярного выражения с циклом:

static String unvowel(String s) {
    Matcher m = Pattern.compile("(?i)[aeiou]").matcher(s);
    StringBuffer sb = new StringBuffer();
    while (m.find()) {
        m.appendReplacement(sb, String.valueOf(m.start()));
    }
    m.appendTail(sb);
    return sb.toString();
}

Необходимо создать копию, чтобы иметь правильные позиции.

В более новой java с лямбдами:

static String unvowel(String s) {
    return s.replaceAll("(?i)[aeiou]", mr -> String.valueOf(mr.start()));
}

Кажется, я ошибся, в строке по-прежнему нет лямбды-замены. Все. Следовательно:

static String unvowel(String s) {
    return Pattern.compile("(?i)[aeiou]").matcher(s)
        .replaceAll("(?i)[aeiou]", mr -> String.valueOf(mr.start()));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...