Вам необходимо изменить свое регулярное выражение, чтобы оно охватывало алфавитные строки, чтобы также учитывать пробелы, и переписать свое регулярное выражение следующим образом:
[a-z_A-Z0-9]*:(?:"\w+(?: \w+)"\s*|\w+(?: \w+)\s*)?
И замените соответствующие части пустой строкой.
Проблема с вашим регулярным выражением в том, что эта часть в вашем регулярном выражении \"?.+\"?
имеет необязательные двойные кавычки, из-за которых .+
жадно сопоставляет все до конца строки и удаляет остальную часть строки, сохраняя только строку перед TAXONOMY:
, что это не то, что вы хотите.
Для правильного решения проблемы вы должны попытаться сопоставить строку в двойных кавычках отдельно со строкой без двойных кавычек. Кроме того, поскольку ваша строка содержит слова, разделенные пробелами, вам необходимо использовать часть \w+(?: \w+)
для правильного соответствия слов, разделенных пробелами, для соответствия. \s*
после этого потребляет лишние пробелы, которые не нужны, и, наконец, соответствует всей вашей строке, а замена на пустую строку оставляет вас с желаемой строкой.
Regex Demo
Попробуйте этот код Java,
String s = "metabolism and heart and TAXONOMY:40674 AND curation:\"Non curated\" GO:GO:34212 and cancer";
System.out.println(s.replaceAll("[a-z_A-Z0-9]*:(?:\"\\w+(?: \\w+)\"\\s*|\\w+(?: \\w+)\\s*)?", ""));
печать
metabolism and heart and cancer