【问题标题】:find a string pattern in a string array在字符串数组中查找字符串模式
【发布时间】:2014-01-20 18:03:13
【问题描述】:

我需要计算输入链中指定模式的出现次数,并为每个模式生成一份报告。 输入字符串将包含 1 个 AA AATTCGAA 结尾 1 表示要搜索的一个模式,AA 是模式,下一个是您要搜索 AA 的部分。

My idea is to : 

    public static void main(String[] args){

        Scanner s = new Scanner(System.in);
        System.out.println("How many patterns do you want and enter patterns and DNA Sequence(type 'end' to signify end):");
        String DNA = s.nextLine();
        process(DNA);
    }
        public static void process(String DNA){
    String number = DNA.replaceFirst(".*?(\\d+).*", "$1");
    int N = Integer.parseInt(number);
        DNA.toUpperCase();
        String[] DNAarray;
        DNAarray = DNA.split(" ");
        for(int i=1; i<N; i++){
            int count=0;
            for(int j =0; j < DNAarray.length; j++) {
                if(DNAarray[i+N].contains(DNAarray[i])){
                      count= count++;
                }
            } 

            System.out.println("Pattern:"+DNAarray[i]+ "Count:"+count);
        }

【问题讨论】:

  • 那么你的问题是什么?什么不工作?有什么问题?
  • 我的问题主要是关于如何在具有多种模式的 AATTCGAA 中找到 AA。进程(DNA)没有搜索被分裂的DNAarray。
  • 我不明白你的前提。您是说必须解析 INPUT 字符串以获得模式数量、模式本身和对象子字符串?如果是这样,那么给出一个包含 2 个模式的示例字符串,因为 1 没有显示如何解析这些模式。
  • 给定您的示例输入格式,“1 AA AAAA”应该给出 2(对于 [AA]AA 和 AA[AA])或 3(对于 [AA]AA,A[AA] ]A 和 AA[AA])?
  • 如果是 [AA]AA、A[AA]A 和 AA[AA],则应该产生 3 个计数)。

标签: regex loops for-loop find match


【解决方案1】:

应该这样做:

using System;
using System.Text.RegularExpressions;

public class Program
{
    public void Main()
    {
        Console.WriteLine(PatternCount("1 AA AADDRRSSAA"));
    }

    public int PatternCount(string sDNA) {
        Regex reParts = new Regex("(\\d+)\\s(\\w\\w)\\s(\\w+)");
        Match m = reParts.Match(sDNA);

        if (m.Success)
        {
            return Regex.Matches(m.Groups[3].Value, m.Groups[2].Value).Count;
        }
        else
            return 0;
        }
}

第一个 RE 将输入拆分为计数、模式和数据。 (不知道为什么要限制要搜索的模式数量。此代码忽略了这一点。根据您的需要进行修改...) 第二个 RE 等于想要的模式,“匹配”计算出现次数。从这里开始工作。

问候

(我今天感觉很好,做人的工作;))

【讨论】:

    【解决方案2】:

    真的没必要放搜索次数。而且,实际上这是可以做到的
    用一个正则表达式。我不记得 Dot-Net 是否支持 \G 锚,
    但这无论如何都没有必要。我把它留在里面了。

    每场比赛:
    找到一个新密钥。
    在末尾捕获键子字符串匹配项。
    仅通过键前进搜索位置。

    所以,坐在查找循环中。
    在每场比赛中打印“关键”捕获缓冲区,
    然后打印捕获集合“值”计数。

    这就是它的全部内容。

    正则表达式将搜索重叠的键。要将其更改为独占键,
    = 更改为 :,如 cmets 所示。

    你也可以让它更具体一点。比如把所有的\w改成[A-Z]等等……

    正则表达式:

     (?:
          ^ [ \d]* 
       |  \G 
     )
     (?<Key> \w+ )                        #_(1)         
     [ ]+ 
    
     (?=
          (?: \w+ [ ]+ )*
    
          (?= \w )
          (?:
               (?=                        # <- Change the = to : to get non-overlapped matches 
                    (?<Values> \1 )       #_(2)         
               )
            |  . 
          )*
          $ 
     )
    

    这是一个 perl 测试用例

     # $str = '2 6 AA TT PP AAATTCGAA';
     # $count = 0;
     # 
     # while ( $str =~ /(?:^[ \d]*|\G)(\w+)[ ]+(?=(?:\w+[ ]+)*(?=\w)(?:(?=(\1)(?{ $count++ }))|.)*$)/g  )
     # {
     #     print "search = '$1'\n";
     #     print "found  = '$count'\n";
     #     $count = 0;
     # 
     # }
     # 
     # Output >>
     #  
     #      search = 'AA'
     #      found  = '3'
     #      search = 'TT'
     #      found  = '1'
     #      search = 'PP'
     #      found  = '0'
     # 
     # 
    

    【讨论】:

      猜你喜欢
      • 2016-10-02
      • 2020-09-06
      • 2020-06-19
      • 2020-11-26
      • 2017-09-04
      • 2022-01-07
      • 2017-03-22
      • 2015-08-06
      相关资源
      最近更新 更多