java - 字符串上的正则表达式,用于匹配和匹配,无论顺序如何

标签 java regex string search

我正在编写一个 Java 程序,一次搜索 15 个字符的 DNA 序列,找到 C 和 G 出现次数最多的部分。我认为检查整个 DNA 序列中子字符串所在的任何区域是最快的。 15 完全由 C 和 G 组成,如果这些不存在,则查找具有 14 个 C 和 G 以及 1 个 A 或 T 的子串。然后,如果没有出现,则查找 13 个 CG 和 2 个 AT,等等...

尝试为此找到正则表达式解决方案对我来说很困难。我已经使用此代码提出了一个测试用例,但我无法让正则表达式工作。我认为语法可能是错误的,我从未在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 会确保长度限制吗?

无论如何,像这样的单行正则表达式会比计算每个子字符串的 C 和 G 更快吗?我还没有上过算法课。

请记住,该程序的最终形式将接受可变长度的字符串,并搜索长度为 n 的子字符串,而不是每次都搜索 15。 (我知道如何处理这些要求,所以不需要告诉我有关 Scanner 或参数如何工作!)我只是一个正则表达式菜鸟,试图使用 Jedi 级别的正则表达式东西......如果你能为我推荐一本书,让我也成为正则表达式的向导,那就太激进了。 预先非常感谢您的回复!

最佳答案

正则表达式是任何语言中最诱人的功能之一。然而,仅仅因为它们很酷、性感并且看起来非常强大,并不意味着它们就是正确的工具。对于这样的事情,一个简单的状态机就足够了,而且可能会快得多。下面的代码查找仅包含 cg 的最长子字符串,并且可以通过将多个子字符串添加到集合中来轻松调整以保留多个子字符串。

    String data = "acgtcgcgagagagggggcccataatggg";
    int    longestPos = 0;
    int    longestLen = 0;
    int p=-1;
    for (int i=0; i<data.length(); i++)
    {
        char c = data.charAt(i);
        if (c == 'c' || c == 'g')  // Is this the droid you're looking for?
        {
            if (p==-1)  // Are we not yet in an interesting string?
                p = i;  // If so, save the position of this start of substring.
        }
        else  // Not a c or g
        {
            if (p != -1 && i-p > longestLen)  // Are we in an interesting string longer than the previous longest?
            {
                longestPos = p;     // Save the starting position
                longestLen = i-p;   // Save the length
            }
            p = -1;   // We're no longer inside an interesting string
        }
    }

    // Handle the case where the last substring was 'interesting'
    if (p != -1 && i-p > longestLen)
    {
        longestPos = p;     // Save the starting position
        longestLen = i-p;   // Save the length
    }

    System.out.printf("Longest string is at position %d for length %d", longestPos, longestLen);

对于“让我们在不适用的地方使用正则表达式”的规范响应,请参阅 this post

关于java - 字符串上的正则表达式,用于匹配和匹配,无论顺序如何,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25748590/

相关文章:

Java:目录路径的变量名,一般命名变量

java - 压缩/缩小/优化 groovy-all、groovy 2.0.1 进行分发?

java - Spring Boot - 处理未找到的静态资源(404)并能够识别异常原因

ios - 如何使用 Swift 在文本字段(从右到左)输入货币格式?

java - 验证文本是否是使用 java 模拟的

c# 正则表达式匹配太慷慨

java - 使用 Eclipse 和 IBM BlueMix Tools 发布应用程序永远无法完成

java - python "elif"的编译方式是否与 else : if? 不同

javascript - Go 语言中的正则表达式 "before text matching"

java - 为什么正则表达式 [^-?0-9]+ 忽略 '?' ?