Как инвертировать регистр символов всего предложения? - PullRequest
1 голос
/ 29 января 2020

Не могу объяснить, как инвертировать регистр символов с помощью обычного. На этом этапе изменяется регистр всех символов, но необходимо, чтобы я менял регистр только в выделении. Что нужно изменить ??

Задача Создать класс, который отображает содержимое текстового файла в консоли, инвертируя регистр всех символов каждого слова, содержащего более 3 символов.

В файле part1.txt содержится
Когда я был моложе
Гораздо моложе
Чем сегодня
Информация из файла
в верхний регистр

part1. java

import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Part1 {

    public static void main(String[] args) throws IOException {
        System.out.println(mainMethod(Util.readFile("part1.txt")));
    }

    public static String mainMethod(String input) {
        Pattern p = Pattern.compile("(\\w{4,}+|[А-Яа-яёЁ]{4,}+)");
        Matcher m = p.matcher(input);
        char[] chars = input.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            char c = chars[i];
            if (m.find(0)) {
                if (Character.isUpperCase(c) || chars.length <= 4) {
                    chars[i] = Character.toLowerCase(c);
                } else {
                    chars[i] = Character.toUpperCase(c);
                }
            }
        }
        return new String(chars);
    }
}

Util. java

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Util {

    private static final String ENCODING = "Cp1251";


    public static String readFile(String path) throws IOException {
        byte[] bytes = Files.readAllBytes(Paths.get(path));
        return new String(bytes, ENCODING);
    }

    public static Matcher getMatcher(String regex, String input) {
        return Pattern.compile(regex).matcher(input);
    }
}

1 Ответ

1 голос
/ 29 января 2020

Вы близки, так как с вашим регулярным выражением все в порядке, и вам нужно l oop, хотя символы найденного соответствия совпадают, хотя есть несколько проблем следующим образом:

• Вам нужно l oop, хотя найденное совпадение вместо массив символов input.toCharArray()

• Получите группу совпадений, используя matcher.group(1)

, поэтому следуйте инструкциям, чтобы устранить проблему:

  1. Используйте while (m.find()), чтобы найти все совпадения
  2. Преобразовать найденное совпадение в массив char, используя m.group(1) как

    char[] chars = m.group(1).toCharArray();
    
  3. Нет необходимости || (ИЛИ) для длины и используйте appendReplacement

Live демо

public static void main(String[] args) {
    System.out.println(mainMethod("When I was younger So much younger Than "+
    "today Информацию из файла в верхний регистр"));
}

public static String mainMethod(String input) {
    Pattern p = Pattern.compile("(\\w{4,}+|[А-Яа-яёЁ]{4,}+)");
    Matcher m = p.matcher(input);
    StringBuffer sb = new StringBuffer(input.length());
    while (m.find()) {
        char[] chars = m.group(1).toCharArray();
        for (int i = 0; i < chars.length; i++) {
            char c = chars[i];
            if (Character.isUpperCase(c)) {
                chars[i] = Character.toLowerCase(c);
            } else {
                chars[i] = Character.toUpperCase(c);
            }
        }
        m.appendReplacement(sb, String.valueOf(chars));
    }
    m.appendTail(sb);
    return sb.toString();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...