我有一些类似的查询字符串:

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的模式。

我在这里做错了什么?有什么帮助吗?

最佳答案

您需要修改正则表达式以覆盖字母字符串,以解决空格问题,并以此方式重新编写正则表达式,

[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

10-07 18:53