【发布时间】:2014-11-03 02:36:57
【问题描述】:
我正在编写一个 Java 程序,一次搜索 15 个字符的 DNA 序列,找到 C 和 G 出现次数最多的部分。我认为检查整个 DNA 序列中子字符串的任何区域是最快的of 15 完全由 C 和 G 组成,如果不存在,则查找具有 14 个 C 和 G 以及 1 个 A 或 T 的子字符串。然后如果没有出现,则 13 个 CG 和 2 个 AT 等...
尝试为此找到一个正则表达式解决方案对我来说很困难。我想出了一个使用此代码的测试用例,但我无法让 RegEx 工作。我认为语法可能是错误的,我从未在 Java 中使用过 RegExes。抱歉,我大概能弄清楚语法,我只需要帮助正则表达式本身匹配正确的东西。
public class DNAChecker{
public static void main(String []args){
String checkThis= "ggccggccaggccgg";
if (checkThis.matches( “(?=.*[CcGg]{14})(?=.*[AaTt]{1})” ) ) {
System.out.println("This program works.");
} else {
System.out.println("This program doesn't work.");
}
}
}
我理解它的方式以及我在相关线程中看到的内容,如果这可以通过正则表达式完成,我至少可以接近这一点。现在我正在考虑它,我认为这不能确保总匹配长度为 15 个字符......即如果 checkThis 长度超过 15 个字符并且总共有 14 个 CG 和 1 个 AT,而不是连续地,这仍然是正确的。所以 xxxxggccggxxccaggccggxxxxxx 是真的。使用 .contains 而不是 .matches 会确保长度限制吗?
无论如何,像这样的单行 RegEx 会比计算每个子字符串的 C 和 G 更快吗?我还没有上过算法课。
请记住,这个程序的最终形式将接受一个可变长度的字符串,并搜索长度为 n 的子字符串,而不是每次都搜索 15 个。(我知道如何处理这些要求,所以无需告诉我有关 Scanner 或参数如何工作的信息!)我只是一个尝试使用绝地级 RegEx 东西的 RegEx 菜鸟......如果你也可以推荐一本书让我成为 RegExes 的向导,那将是激进的。 非常感谢您的回复!
【问题讨论】:
-
恐怕正则表达式对于这个问题可能不会对你太有用。我建议只计算字符串中
cs 和gs 的数量 -
关于正则表达式的信息/教程,试试这个网站:regular-expressions.info
-
您能否提供一些输入字符串的示例以及您想要输出的内容?如果我理解正确,您有一个相当大的输入字符串,并查找最多 15 个字符的序列,其中仅包含
c和g,最后带有a或t。对吗? -
要记住的一点是
String.matches(regex)和Pattern.compile(regex).matcher(String).find()之间的区别。前者寻找一个 exact 匹配,而后者只是寻找正则表达式作为原始输入的子字符串。因此,在您的情况下,您可能希望使用Pattern.compile(regex).matcher(String).find()来确定正则表达式是否与输入的任何子字符串匹配。