单独的搜索关键字和构面

时间:2019-04-27 07:42:10

标签: java regex groovy split

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

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 个答案:

答案 0 :(得分:1)

您需要修改正则表达式以覆盖字母字符串,以便也考虑空格,并以此方式重新编写正则表达式,

[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