Не отображается кириллица
Делаю практическую задачу по 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());
}