Отдельный поиск по ключевым словам и аспектам - PullRequest
1 голос
/ 27 апреля 2019

У меня есть что-то вроде строки запроса:

String query = 'metabolism and heart and TAXONOMY:40674 AND curation:"Non curated" GO:GO:34212 and cancer'

Я пытаюсь извлечь из этой строки запрос по ключевым словам. Ожидаемый результат для этого запроса

metabolism and heart and cancer

Как у меня дела?

String regex = '[a-z_A-Z0-9]*:\"?.+\"?'
query.replaceAll(regex, '')

Этот фрагмент хорошо работает, если строка запроса помещается в начало строки запроса, как показано ниже:

String query = 'metabolism and heart and cancer and TAXONOMY:40674 AND curation:"Non curated" GO:GO:34212'

Фасеты являются парами, такими как curation:"Non curated" (то есть с пробелами в значении и заключенными в двойные кавычки) или GO:GO:34212 (то есть со вторым двоеточием). В противном случае это шаблоны типа TAXONOMY:234334.

Что я здесь не так делаю? Любая помощь?

1 Ответ

1 голос
/ 27 апреля 2019

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

[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
...