Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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_Regex_Pattern Matching - Fatal编程技术网

Java 将不同的模式匹配到字符串

Java 将不同的模式匹配到字符串,java,regex,pattern-matching,Java,Regex,Pattern Matching,(这是一个后续问题) 所以我有一条DNA链 e、 g 我有20个不同的3字母模式(每个组合对应一个氨基酸),我想与数据匹配。我的java程序一次查看3个字母,并尝试将其与其中一个模式匹配。我想最终计算每个氨基酸出现的次数,所以当我找到匹配项时,我需要增加一个特定的计数器。我想使用java正则表达式实现这一点,因此我有: Pattern A = Pattern.compile("(gct)|(gcc)|(gca)|(gcg)"); Pattern C = Pattern.compile("(tgt

(这是一个后续问题)

所以我有一条DNA链

e、 g

我有20个不同的3字母模式(每个组合对应一个氨基酸),我想与数据匹配。我的java程序一次查看3个字母,并尝试将其与其中一个模式匹配。我想最终计算每个氨基酸出现的次数,所以当我找到匹配项时,我需要增加一个特定的计数器。我想使用java正则表达式实现这一点,因此我有:

Pattern A = Pattern.compile("(gct)|(gcc)|(gca)|(gcg)");
Pattern C = Pattern.compile("(tgt) | (tgc)");
Pattern D = Pattern.compile("(gat) | (gac)");
等等


然而,我现在意识到,您需要为每个模式创建一个匹配器,而不能使用一个匹配器来搜索所有模式;对于我来说,实现我所要做的事情的最佳方式是什么

对正则表达式进行因式分解:

(gc[tcag]|(tg|ga)[tc])

我不会在这里使用正则表达式。您有四个字母,因此
4^3=64
可能是三元组。只需在字符串上循环,将每个三元组转换为它的数字(
a->0,c->1,g->2,t->3
,因此
gcc->2*4^2+1*4^0=37
),递增
计数器[数字]
,并忽略结尾不需要的数字。(如果您还需要位置,在插入到适当的列表中以节省空间之前,可能需要检查当前三元组是否是所需的位置之一。)

尝试一下

String dna = "acagatgaaggaggacgcgcccccgccgctgtcctgcgcctcagccatcctatgagacgg";

Pattern p = Pattern.compile("(gct)|(gcc)|(gca)|(gcg)");
Matcher m = p.matcher(dna);

int count = 0;
while(m.find()) {
  count ++;
}

您可以使用如下表达式

(?<gc>gc[tcag])|(?<tg>tg[tc])|(?<ga>ga[tc])
(?gc[tcag])|(?tg[tc])|(?ga[tc]))
但是,不能对字符串使用正则表达式。它会给你很多误报

字符串中唯一有效的氨基是GAT GCC和GCT,如果对字符串使用正则表达式,最多可以找到11个结果

因此,首先需要将字符串分成3个字符组,然后使用正则表达式将模式与之匹配

试试正则表达式:

(?<gc>gc(?=[tcag]))|(?<tg>tg(?=[tc]))|(?<ga>ga(?=[tc]))
(?gc(?=[tcag]))|(?tg(?=[tc]))|(?ga(?=[tc]))
根据你的字符串,它将产生11个结果。不是你想要的

小心你想要的,你可能会得到的。(或者比你想要的多得多)

Dim dna As String=“acagagagagacgcccgccgcctgtcctgcgccctcagcccatcctatgagacgg”
作为新ArrayList的Dim图案
对于x=0到dna。长度-1步骤3
Dim match As match=Regex.match(dna.Substring(x,3),“(?gc[tcag])|(?tg[tc])|(?ga[tc])”)
如果匹配,那么成功
pattern.Add(match.Value)
如果结束
下一个
这将给你4个结果

服 -海湾合作委员会 -海湾合作委员会 -gct


匹配所有3个有效的氨基值

您知道字符串中的边界在哪里吗?是每三个字母吗?如果你不知道,我认为正则表达式会因为一些模式会重叠而变得复杂。例如,从上面字符串的第17个字符开始,有“gcgcc”-这将匹配从第一个位置开始的“gcg”,但也将匹配从第三个位置开始的“gcc”。这些匹配项共享字符串中的第二个g,所以我怀疑这是否真的意味着在这些位置上有两种不同的酸。user1058210,让这些人做你的GC04课程作业真的不酷,你真的应该自己做。和平!
(?<gc>gc(?=[tcag]))|(?<tg>tg(?=[tc]))|(?<ga>ga(?=[tc]))
Dim dna As String = "acagatgaaggaggacgcgcccccgccgctgtcctgcgcctcagccatcctatgagacgg"
    Dim pattern As New ArrayList
    For x = 0 To dna.Length - 1 Step 3
        Dim match As Match = Regex.Match(dna.Substring(x, 3), "(?<gc>gc[tcag])|(?<tg>tg[tc])|(?<ga>ga[tc])")
        If match.Success Then
            pattern.Add(match.Value)
        End If
    Next