Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中查找字符串模式_Java_Arrays_String_Sequence - Fatal编程技术网

在Java中查找字符串模式

在Java中查找字符串模式,java,arrays,string,sequence,Java,Arrays,String,Sequence,我想在以下字符串中找到一个模式: NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTTCAANGGGACGGAGCGGGTGCNGTNNCNGGANAGANNCNTCNATNANCNNGAGGAGNNCNNGCGCTTCGACAGCGACGTGGGGGAGTNCNNGGCGGTGACNGAGCTNGGGCGGCCTNNNGNNGAGNNCTGGAACAGCCAGAAGGACNTCCTGGANNNNNNNCNNGNCNNNGTGGACANNNNNTGCAGACACAAC

我想在以下字符串中找到一个模式:

NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTTCAANGGGACGGAGCGGGTGCNGTNNCNGGANAGANNCNTCNATNANCNNGAGGAGNNCNNGCGCTTCGACAGCGACGTGGGGGAGTNCNNGGCGGTGACNGAGCTNGGGCGGCCTNNNGNNGAGNNCTGGAACAGCCAGAAGGACNTCCTGGANNNNNNNCNNGNCNNNGTGGACANNNNNTGCAGACACAACTACGGGGNTGNNNNNNNNNNNNNNNNNNNNNNNNNNN
模式必须至少包含4个相邻字符,但“N”除外

例如,在这个字符串中

NNNNNTTCAANGGGACGG.....
我可以得到“TTCA”“TCAA”“GGGA”“GGAC”“GACG”“ACGG”

我想找到任何可能与模式匹配的字符串

哪种方法最好

我可以创建一个数组并读取每个字符。 然而,有没有更好的设计和想法呢


谢谢大家!

您可以使用
模式
匹配器
。使用
匹配器#find(int index)
可以从指定的索引开始匹配。给定的
模式
被匹配,并且
匹配器
被重置为从上一个匹配位置+1开始,因此不会遗漏任何子字符串

代码

public static void main(String[] arguments) throws FileNotFoundException {
    Matcher m = Pattern.compile("[A-M|O-Z]{4}").matcher(
            "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTT"
                    + "CAANGGGACGGAGCGGGTGCNGTNNCNGGANAGANNCNTC"
                    + "NATNANCNNGAGGAGNNCNNGCGCTTCGACAGCGACGTGG"
                    + "GGGAGTNCNNGGCGGTGACNGAGCTNGGGCGGCCTNNNGN"
                    + "NGAGNNCTGGAACAGCCAGAAGGACNTCCTGGANNNNNNN"
                    + "CNNGNCNNNGTGGACANNNNNTGCAGACACAACTACGGGG"
                    + "NTGNNNNNNNNNNNNNNNNNNNNNNNNNNN");

    int index = 0;
    while (m.find(index)) {
        index = m.start() + 1;
        System.out.println(m.group());
    }
}
输出

TTCA
TCAA
GGGA
GGAC
GACG
ACGG
CGGA
GGAG
GAGC
AGCG
GCGG
CGGG
GGGT
GGTG
GTGC
GAGG
AGGA
GGAG
GCGC
CGCT
GCTT
CTTC
TTCG
TCGA
CGAC
GACA
ACAG
CAGC
AGCG
GCGA
CGAC
GACG
ACGT
CGTG
GTGG
TGGG
GGGG
GGGG
GGGA
GGAG
GAGT
GGCG
GCGG
CGGT
GGTG
GTGA
TGAC
GAGC
AGCT
GGGC
GGCG
GCGG
CGGC
GGCC
GCCT
CTGG
TGGA
GGAA
GAAC
AACA
ACAG
CAGC
AGCC
GCCA
CCAG
CAGA
AGAA
GAAG
AAGG
AGGA
GGAC
TCCT
CCTG
CTGG
TGGA
GTGG
TGGA
GGAC
GACA
TGCA
GCAG
CAGA
AGAC
GACA
ACAC
CACA
ACAA
CAAC
AACT
ACTA
CTAC
TACG
ACGG
CGGG
GGGG

一种方法是使用带有一些过滤、映射和收集功能的Java 8流:

String str = "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTTCAANGGGACGGAGCGGGTGCNGTNNCNGGANAGANNCNTCNATNANCNNGAGGAGNNCNNGCGCTTCGACAGCGACGTGGGGGAGTNCNNGGCGGTGACNGAGCTNGGGCGGCCTNNNGNNGAGNNCTGGAACAGCCAGAAGGACNTCCTGGANNNNNNNCNNGNCNNNGTGGACANNNNNTGCAGACACAACTACGGGGNTGNNNNNNNNNNNNNNNNNNNNNNNNNN";
final char[] src = str.toCharArray();

final int len = 4;
final int ch = 'N';
final List<String> collect =
        IntStream.range(0, str.length() - len)
                .filter(offset -> IntStream
                        .range(offset, offset + len)
                        .noneMatch(i -> src[i] == ch))
                .boxed()
                .map(i -> str.substring(i, i + len))
                .collect(Collectors.toList());

System.out.println(collect); // [TTCA, TCAA, GGGA, GGAC, ....
String str=“nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnngctgagcannngcagagagagagagagagngngngngngngcgacgacgacggggggggggggngngngngngngngngcgctgagagagagagngngngngngngngngngngngngcgacgacgacggggggggngngngngngngngngcnngcggggtgngngngngngngngcnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn;
final char[]src=str.toCharArray();
最终整数长度=4;
最终int ch='N';
最终名单收集=
IntStream.range(0,str.length()-len)
.filter(偏移量->输入流
.范围(偏移、偏移+透镜)
.noneMatch(i->src[i]==ch))
.boxed()
.map(i->str.substring(i,i+len))
.collect(Collectors.toList());
系统输出打印项次(收集);//[TTCA,TCAA,GGGA,GGAC。。。。

这是我的正则表达式过敏解决方案。感谢@Niels Billen提供了良好的源字符串格式

public static void main(String[] args) {
     String string =  "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTT"
                        + "CAANGGGACGGAGCGGGTGCNGTNNCNGGANAGANNCNTC"
                        + "NATNANCNNGAGGAGNNCNNGCGCTTCGACAGCGACGTGG"
                        + "GGGAGTNCNNGGCGGTGACNGAGCTNGGGCGGCCTNNNGN"
                        + "NGAGNNCTGGAACAGCCAGAAGGACNTCCTGGANNNNNNN"
                        + "CNNGNCNNNGTGGACANNNNNTGCAGACACAACTACGGGG"
                        + "NTGNNNNNNNNNNNNNNNNNNNNNNNNNNN";

     for (String s: string.split("N")) {
         for (int i = 0 ; i <= s.length() - 4 ; i++) {
             System.out.println(s.substring(i, i + 4));
         }
     }
}
publicstaticvoidmain(字符串[]args){
String String=“nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnntt”
+“CAANGGACGGAGGGGTGCNGTNNCNGANGANGANNCNTC”
+“NATNANCNGAGGANCNNGCGCTTCGACGACGTGG”
+“gggagtncnggcggtgacngctnggggcctnnngn”
+“ngagnnctggagacagagagagagacntcctggannnnnnnnn”
+“CNNGNCNNNGTGGACANNNTGCAGACAACTAGGGG”
+“Ntgnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn;
对于(字符串s:String.split(“N”)){

对于(int i=0;i),您可能想看看Java是如何工作的。web.string.replaceAll(“N”),中也有大量的regexp教程;然后从每个位置读取4个字符。@user1445898不,不能,因为字符必须是连续的,例如“AANGG”不能生成没有“N”的连续单词,但如果我删除“N”那就是“啊”了wrong@user1445898字符在原始字符串中必须是连续的。@kaktusito默认正则表达式不“相交”,即“{2}”将只与“123”匹配一次。而且正则表达式更难理解,因此如果可能,我宁愿避免使用它们。