Нужно удалить из строки всё, кроме слова Windows, пробелов и цифр

Вот какой код есть, но не знаю что написать в регулярке, чтоб удаляло то что мне надо

    String str1 = "BATTERY_CAPACITY=1, OS=Windows, MEMORY_ROM=4000, SYSTEM_MEMORY=1000, CPU=1.2, DISPLAY_INCHS=18";
    String str2 = str1[1].replaceAll("[^(0-9\\.\s)]|[^Windows]","");

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

Автор решения: Nowhere Man

Очевидно в данной задаче нужно выбрать "значения" из пар ключ=значения, удаляя запятые и оставляя пробелы.

Такую задачу решить гораздо проще при помощи следующих выражений:

String str1 = "BATTERY_CAPACITY=1, OS=Windows, MEMORY_ROM=4000, SYSTEM_MEMORY=1000, CPU=1.2, DISPLAY_INCHS=18";

// удалить все символы до знака `=` кроме пробелов или запятые
String str2 = str1.replaceAll("[^=\\s]+=|,", "");
System.out.println(str2);
// -> 1 Windows 4000 1000 1.2 18

// удалить заглавные буквы/`_` и знак `=` или запятые
String str3 = str1.replaceAll("[A-Z_]+=|,", "");
System.out.println(str3);
// -> 1 Windows 4000 1000 1.2 18

Также можно отфильтровать входную строку и выбрать из неё необходимые совпадения Windows или последовательности из цифр, пробелов, и точек:

Pattern p = Pattern.compile("Windows|[\\s\\d\\.]+");
String str2 = p.matcher(str1).results()
    .map(MatchResult::group)
    .collect(Collectors.joining());
// -> 1 Windows 4000 1000 1.2 18

Или же можно искать любые значения после знака =, разделённые запятыми (оба вида разграничителей помещаются в группы без захвата (?:)):

Pattern p = Pattern.compile("(?:=)([^,]+)(?:,?)(\\s*)");
String str4 = p.matcher(str1).results()
        .map(mr -> mr.group(1) + mr.group(2)) // группа 1 - значение, 2 - пробелы
        .collect(Collectors.joining());
// -> 1 Windows 4000 1000 1.2 18
→ Ссылка