Не отображается кириллица

Делаю практическую задачу по java по регулярным выражениям Суть: в файлике у нас есть данные различных типов, и нам при вводе double нужно вывести все числа с плавающей точкой. Работает оно вроде бы как верно, но кириллицу не хочет выводить, почему так? вроде бы регулярка настроена корректно, кодировка ср1251

public class Part3 {
private static final String STRING_REGEX = "\\b[а-яА-Яa-zA-Z]{2,}\\b";
private static final String CHAR_REGEX = "\\b[а-яА-Яa-zA-Z]\\b";
private static final String INT_REGEX = "\\b[\\d]+\\b";
private static final String DOUBLE_REGEX = "(?<=\\s|^)(-?(\\d*\\.\\d+)|(\\d+\\.\\d*)[dD]?)(?=\\s|$)";
private static final Logger LOGGER = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);

public static void main(String[] args) {
    String str = returnInput("part3.txt", "cp1251");
    String[] words = str.split(" ");
    String choice = "";
    Scanner sc = new Scanner(System.in);
    while (sc.hasNext()) {
        choice = sc.next();
        switch (choice) {
            case "String":
                printValues(words, STRING_REGEX);
                break;
            case "char":
                printValues(words, CHAR_REGEX);
                break;
            case "int":
                printValues(words, INT_REGEX);
                break;
            case "double":
                printValues(words, DOUBLE_REGEX);
                break;
            case "stop":
                break;
            default:
                System.out.println("Incorrect input");
        }
        if (choice.equals("stop")) {
            break;
        }
    }
}

public static String returnInput(String fileName, String encoding) {
    StringBuilder sb = new StringBuilder();
    Charset cs = encoding == null ? Charset.defaultCharset() : Charset.forName(encoding);
    try {
        Scanner scanner = new Scanner(new File(fileName), cs.name());
        while (scanner.hasNextLine()) {
            sb.append(scanner.nextLine()).append(System.lineSeparator());
        }
        scanner.close();
        return sb.toString().trim();
    } catch (IOException e) {
        LOGGER.warning(e.toString());
    }
    return sb.toString();
}

public static void printValues(String[] dest, String regex) {
    StringBuilder sb = new StringBuilder();
    Pattern p = Pattern.compile(regex);
    for (int i = 0; i < dest.length; i++) {
        Matcher m = p.matcher(dest[i]);
        if (m.matches()) {
            sb.append(m.group()).append(" ");
        }
    }
    System.out.println(sb.toString());
}
}

Ответы (1 шт):

Автор решения: Alexey R.

Ваша тестовая строка вот здесь String[] words = str.split(" "); разбивается на 7 кусков: expected:<bcd, [фыва, ], <, but, was:<bcd, []. Из перечисленного, только but матчится Вашим регулярным выражением.

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

public static void main(String[] args) {
    final String REGEXP = "([a-zA-Zа-яЁА-Яё]{2,})";
    String test = "expected:<bcd [фыва ] > but was:<bcd []";
    printValues(test, REGEXP);
}

public static void printValues(String dest, String regex) {
    StringBuilder sb = new StringBuilder();
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(dest);
    while (m.find()){
        sb.append(m.group()).append(" ");
    }
    System.out.println(sb.toString());
}
→ Ссылка