我有一些类似的查询字符串:
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
之类的模式。
我在这里做错了什么?有帮助吗?
答案 0 :(得分:1)
您需要修改正则表达式以覆盖字母字符串,以便也考虑空格,并以此方式重新编写正则表达式,
[a-z_A-Z0-9]*:(?:"\w+(?: \w+)"\s*|\w+(?: \w+)\s*)?
然后用空字符串替换匹配的部分。
正则表达式的问题是,正则表达式\"?.+\"?
的这一部分具有可选的双引号,因为.+
会贪婪地匹配所有内容,直到字符串结尾,并删除其余字符串,仅保留字符串TAXONOMY:
并不是您想要的。
为正确解决该问题,您应该尝试将双引号字符串与非双引号字符串分别匹配。另外,由于字符串中包含空格分隔的单词,因此您需要使用\w+(?: \w+)
部分来正确匹配空格分隔的单词以进行匹配。 \s*
之后会消耗掉多余的空格,最终匹配您所有的字符串,用空字符串替换会留下所需的字符串。
尝试此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