我有一些类似的查询字符串:
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