java的Matcher 匹配多行,用于解析Fasta文件

举报
benymorre 发表于 2019/04/05 16:15:29 2019/04/05
【摘要】 fasta文件格式如下:>ABCGGTTCCAAACCGGTTAATTGGGGGCCCGGGTTAAATGGAAGGATTTCCCAATTGGA>DEFAAAAATTTTTGGGGGCCCCCCGGGAATCCCCAAAACACACACATTTTGGGAGCAGGCAG>GHIAATTCGCGGCATCGCATTCAGCGCGACTACGACTACGATGCATCAGCAGCATCG>JKL...

fasta文件格式如下:

>ABC
GGTTCCAAACCGGTT
AATTGGGGGCCCGGGTT
AAATGGAAGGATTTCCC
AATTGGA
>DEF
AAAAATTTTTGGGGGC
CCCCCGGGAAT
CCCCAAAACACACACA
TTTTGGGAGCAGGCAG
>GHI
AATTCGCGGCATCGCATTCAGC
GCGACTACGACTACGATGCATCAG
CAGCATCG
>JKL
AATTAGGATTTGTGCTAGCATG
CGCGGCTCGCGGCCCCCCCGGAT
CGCGATTGGCATC
CAGTCGTAGCTACGTAGCT


> 符号后是基因名或者Contig ID (Contig的解释:用二代测序或一代测序得到的较短的seq拼接成的较长的序列,拼接的原理就是基于seq之间的重叠碱基,拼接获得的序列称为Contig

然后跟着的几行是碱基序列


在Java中匹配多行,需要用DOTALL参数


示例如下:

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class patMatcher {

        public static void main(String[] args) {
                String s = ">adsds\nATGGGC\nAAAAGG\n";
                String seq_id = "";
                String sequence = "";
                
                Pattern p = Pattern.compile("(>.*?\\s)([ATCG\\s]+)", Pattern.DOTALL);
                Matcher mat = p.matcher(s); 
                while (mat.find()){System.out.print(mat.group(2));}
        }
}


s 代表一条contig序列,ID是adsds, 碱基序列是多行的ATGGGCAAAAGG

定义一个Matcher, 返回的mat.group(2) 就是碱基序列。


对于fasta文件,解析的方法如下:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class ReadFa {

        public static void main(String[] args) throws IOException{
                // Scanner s = null;
                StringBuilder s =  new StringBuilder();
                String seq_id = "";
                String sequence = "";

                String line;
                try {
                        // s = new Scanner(new BufferedReader(new FileReader(args[0])));
                        // Pattern p = Pattern.compile("^(?!>.*\n)[ATGC\n]+", Pattern.MULTILINE);
                        BufferedReader r = new BufferedReader(new FileReader(args[0]));
                        while((line=r.readLine())!=null) {
                                s.append(line);
                                s.append("\n");
                        } 
                        Pattern p = Pattern.compile("(>.*?\\s)([ATGC\\s]+)", Pattern.DOTALL);
                        Matcher mat = p.matcher(s.toString()); 
                        while (mat.find()) {
                                seq_id = mat.group(1);
                                sequence = mat.group(2);
                                System.out.print(seq_id);
                                System.out.print(sequence);
                        }
                        // String str = s.findWithinHorizon(p, 0);
                        /* do {
                                System.out.println(str);
                                str = s.findWithinHorizon(p, 0);

                        } while (str != null); */
                } catch (FileNotFoundException e) {
                        System.out.println(e.getMessage());
                }
                /* } finally {
                        if (s != null) {
                                s.close();
                        }
                } */
        }
}


javac ReadFa.java


java ReadFa test_A.fasta

这样就能输出每条序列的ID和对应的碱基序列了。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。