Как я могу удалить слова с большим количеством гласных, чем согласных, используя регулярные выражения - PullRequest
0 голосов
/ 23 марта 2020

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

 StringBuilder text = new StringBuilder("I quite hate regular expressions");

Я должен написать код, который будет возвращать text без слов «вполне» и «I», потому что эти слова содержат больше гласных, чем согласных. Также он должен работать с другими образцами текста.

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

public String removeWordsWithMoreVowels(final StringBuilder text) {
    Pattern pattern = Pattern.compile("regular expression goes here");
    Matcher matcher = pattern.matcher(text);
    System.out.println(matcher.replaceAll(""));
    return matcher.replaceAll("");
}

Как мне этого добиться? Все советы и рекомендации приветствуются. Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 23 марта 2020

Это не может быть сделано с помощью регулярных выражений. Проблема в том, что v n c n не подходит для такой грамматики без контекста без контекста, как в регулярных выражениях. Используя регулярное выражение с лямбда-выражением, можно использовать немного кода.

public String removeWordsWithMoreVowels(final StringBuilder text) {
    Pattern pattern = Pattern.compile("(?i)\\b[a-z]+\\b");
    Matcher matcher = pattern.matcher(text);
    return matcher.replaceAll(mr -> {
        int vowels = mr.group().replaceAll("(?i)[^aeiou]", "").length();
        return vowels > mr.group().length() - vowels ? "" : mr.group();
    });
}

Выше приведено небольшое упрощение, поскольку оно не касается удаления пробелов путем удаления.

  • (?i) без учета регистра
  • [^aeiou] - не гласная; согласный (около y: может быть, сначала нужно удалить их)
2 голосов
/ 23 марта 2020

Вот одно из решений. Он использует единственное регулярное выражение для гласных.

  • удаляет все гласные из слова. Пусть новая длина будет NC для количества согласных.
  • вычтите NC из длины слова начала координат. Это количество гласных: VC
  • Если VC <= NC, оставьте слово. Обратите внимание, что это сохраняет слова, где количество гласных равно числу согласных.
    String[] words = { "radar", "hello", "saygoodbyeeee","coolbeans" };
// or
    String[] words = "I quite hate regular expressions".split("\\s+");

Затем используйте это

        List<String> keep = new ArrayList<>();
        for (String word : words) {
           int nocons = word.replaceAll("(?i:[aeiou])","").length();
           if (word.length()-nocons <= nocons) {
               keep.add(word);
           }
        }

        System.out.println(keep);
1 голос
/ 23 марта 2020

В общем случае это невозможно: конечные автоматы, к которым относятся регулярные выражения, не могут считать n совпадения с возможно бесконечным пределом.

Вы можете делать то, что хотите, до конечного числа согласных c и конечное число гласных v, но вы не можете создать общее регулярное выражение для express всех совпадений c < v, чтобы c -> infinity и v -> infinity.

Ваша проблема может быть выражается контекстно-зависимым сопоставителем (который является линейно-ограниченным автоматом ).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...