你精通正则表达式吗?不妨进来瞧瞧!

tomcatjava 2004-10-21 11:12:24
最近遇到一个问题,就是想从有一定规则的字符串中提取信息!样本如下:
AC****T01714
XX****ID****T01714
XX****DT****07.03.1996 (created); ewi****DT****04.09.1996 (updated); ewi****CO****Copyright (C), Biobase GmbH
XX****FA****HOXA10 PL2
XX****SY****PL2.
XX****OS****human, Homo sapiens****OC****eukaryota; animalia; metazoa; chordata; vertebrata; tetrapoda; mammalia;****OC****eutheria; primates
XX****HO****Abd-B (Drosophila)
XX****CL********C0006****homeo;****3.1.1.1.7.2****.
XX****SZ****94 AA; 11.5 kDa (gene)
XX****SQ****MCQGNSKGENAANWLTAKSGRKKRCPYTKHQTLELEKEFLFNMYLTRERRLEISRSVHLT****SQ****DRQVKIWFQNRRMKLKKMNRENRIRELTANFNFS
XX****SC****edited SwissProt #P31260
XX****FT****1 3****replaced by 1-405 in splice variant PL1.****FT****17 76****homeo domain.****XX****CP****myelomonocytic cells and other hematopoietic cells****[1]****XX****FF****broader expression pattern than the long splice variant PL1****[1]****.
XX****DR****EMBL:****X58430****; HSHOX18.
XX****RN [1]****RX****MEDLINE;****91288229****.****RA********Lowney P., Corral J., Detmer K., Lebeau M. M., Deaven L., Lawrence H. J.,********RA********Largman C.********RT****A human Hox 1 homeobox gene exhibits myeloid-specific expression of****RT****alternative transcripts in human hematopoietic cells.****RL****Nucleic Acids Res. 19:3443-3449 (1991).
XX
//****


说明:
打印"****"的地方是我加上,以便间隔开容易识别字符串。除了"****",就都是所需要提取的字符串了。
基本模式是:key-value形式的(如:AC****T01714XX,FA****HOXA10 PL2XX)键值(如AC,FA)是可枚举的,放在连表或数组里的,但是也有不符合此格式的,(如FT****1 3****replaced by 1-405 in splice variant PL1.****FT****17 76****homeo domain.****XX),它的值有多项,分开写的!!而且出现两个相同的key(如FT)



我想这种情况最好的办法是用正则表达式提取吧!
试问各位:如何写这个Pattern,才能提取出或得到符合格式的数据(key-value)呢?(保证key只出现一次,然后value包含所有的key的值)

非常感谢各位先!
...全文
376 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
tomcatjava 2004-10-26
  • 打赏
  • 举报
回复
搞定!谢谢各位
tomcatjava 2004-10-25
  • 打赏
  • 举报
回复
自己sp一下!
新来的萌新 2004-10-22
  • 打赏
  • 举报
回复
gz + up + lg
tomcatjava 2004-10-22
  • 打赏
  • 举报
回复
非常感谢 jamesfancy()边城狂人(James Fancy)及各位的关注!
其实那些数据是此Web页面上抽取下来的,里面还包含有别的字符(如打印符,换行符等),而且使用string.trim()也不能去掉那些表面看来是空格的特殊字符,感觉还是有些麻烦的!

可以仔细看一下那些数据:我本来在每个数据Entry后打印四个星“****”,而抽取出的数据有的包含六七个星,估计那是非打印字符惹得祸吧!

这该如何解决?
wtobias 2004-10-21
  • 打赏
  • 举报
回复
gz
vongood 2004-10-21
  • 打赏
  • 举报
回复
关注罗。
moke33 2004-10-21
  • 打赏
  • 举报
回复
BufferedReader in = new BufferedReader(
new FileReader("lib/ori_src.txt"));
PrintWriter out = new PrintWriter(
new File("lib/result.txt"));
StringTokenizer token;
String content = null;
while((content = in.readLine()) != null){
token = new StringTokenizer(content,"*");
while(token.hasMoreTokens()){
out.println(token.nextToken());
}
}
in.close();
out.close();
边城狂人 2004-10-21
  • 打赏
  • 举报
回复
如果换行符不是分隔符的话,那么可以把所有行都直接连接起来,当然这样比较耗资源。
你可以每取一行,进行一次 token 分析。
把最后一个 token 和下面一条连接起来再进行 token 分析
因为你这个情况实在有些复杂,所以用正则表达式实在不太合适。
tomcatjava 2004-10-21
  • 打赏
  • 举报
回复
谢谢楼上的朋友!

我最初的想法也是想这样做的,分解成token,比较,主要是感觉麻烦的,因为不只是提取key-value,
还有考虑到,有的key具有同义词,比如最后几行的RX,RA,RT,RL都认为是同一个key,而且有的值value分成几行,并不是严格已key-value格式出现的,所以还得解决value和那个key对应正确的问题。

我现在正在写这个算法,我只是想有没有比这种实现更好,更简便些的方法或算法!

非常感谢!!
边城狂人 2004-10-21
  • 打赏
  • 举报
回复
这种情况比较复杂,用正则表达式可能会比较麻烦,而且据说正则表达式的效率也不是很好。
不如用 Tokenizer 来分解。
首先肯定是以行为单位,然后用 Tokenizer 分析每一行的数据,再分析每一个 token
tomcatjava 2004-10-21
  • 打赏
  • 举报
回复
自己up一下!

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧