2016-05-19 8 views
0

与えられた入力テキストのテキストパターンを識別するプログラムを作成しようとしています。例えば、私のテキストはこのようなものになるだろう:テキストシーケンスの検出

This is a test xa .. blah blah 
This is a test xd .. blah blah.. 
This is a test x3 .. blah blah.. 
This is a test xa .. blah blah 
This is a test xd .. blah blah.. 
This is a test x3 .. blah blah.. 
This is a test xa .. blah blah 
This is a test xd .. blah blah.. 
This is a test x3 .. blah blah.. 
This is a test bc .. blah blah.. 
This is a test some more useless text.. 
This is a test x3 .. blah blah.. 
This is a test some more useless text.. 
This is a test xa .. blah blah 
This is a test some more useless text.. 

私は別の行にx'digit/text'を繰り返し、何度も何度も繰り返すのシーケンスを見つける必要があります。したがって、上記のケースでは、それはxa, xd, x3であり、3回繰り返されます。したがって、別のケースでは、x1, x2, x3, x4が5回繰り返される可能性があります。正規表現を使ってこの問題を解決できますか? Javaプログラムを作成すると、このシーケンスを効率よくどのように検出できますか?

+1

繰り返し前にどのシーケンスを確認しようとしていますか。あなたの "反復基準"を満たすためにシーケンスに定義したい最低限の反復回数はありますか? –

+0

@littlecegianはい、私のシーケンスは数字xまたは別のアルファベットが続く文字xです。そして、はい、私は反復の数が最小の3だと思います。 – Jay

+0

xに続けて数字または文字を1行に複数回表示できますか?それはそれが自分の言葉である(またはテキサスはxaとして認定されていますか)という要件ですか?私の直接の期待は、繰り返しパターンを検出するために正規表現を使用できますが、そうしたくないということです。 –

答えて

2

確かです。 (.*x[0-9a-z].*\n)+thisような何かをしようとする

たりはできる:.*xa.*\n.*xd.*\n.*x3.*\n

編集: thisようなもので起動してみてください。

+0

お返事ありがとうございました。私は上のテキストの正規表現を探しているわけではありません - 任意の 'x'と数字/アルファベットの組み合わせと何回かの繰り返しで機能する一般的なものが必要です – Jay

+0

どうぞ、どうぞ。私はあなたが単純な正規表現で必要なトークンを検索し、Javaを介してマッチング時間を数えることができると思います。そうでしょう?つまり、問題の詳細をご提供いただければ、より良いお手伝いをすることができます。正規表現は私が本当に好きなものです。 – Jaumzera

+0

完了、@ClasG。ありがとうございました。 – Jaumzera

2

私はそれが努力を示していない(あなたも私の質問に答えていない)誰かのためのソリューションを開発するための貧弱なstackoverflowスタイルだと思います。それにもかかわらず。

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 

public class RepeatingPatternMain { 

    LineParser parser = new LineParser(); 

    public RepeatingPatternMain(String fileName) throws IOException { 
     try (BufferedReader br = new BufferedReader(new FileReader(fileName))) { 
      String line = br.readLine(); 
      while (line != null) { 
       parser.acceptLine(line); 
       line = br.readLine(); 
      } 
     } 
     parser.done(); 
    } 

    public static void main(String[] args) throws IOException { 
     if (args.length == 1) { 
      new RepeatingPatternMain(args[0]); 
     } else { 
      System.out.println("Usage: java RepeatingPatternMain <file>"); 
     } 
    } 

} 

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class LineParser { 

    Pattern xPat = Pattern.compile(".*x([0-9a-z]).*"); 
    RepeatingPatternRecognizer rpr = new RepeatingPatternRecognizer(); 

    public void acceptLine(String line) { 
     Matcher m = xPat.matcher(line); 
     if (m.matches()) { 
      String charAfterX = m.group(1); 
      assert charAfterX.length() == 1 : charAfterX; 
      rpr.lineWithX(charAfterX.charAt(0), line); 
     } else { 
      rpr.lineWithoutX(line); 
     } 
    } 

    public void done() { 
     rpr.finish(); 
    } 

} 

import java.util.ArrayList; 
import java.util.List; 

public class RepeatingPatternRecognizer { 

    private static final int minRepeats = 3; 

    List<LineForAnalysis> lines = new ArrayList<LineForAnalysis>(); 

    public void lineWithX(char charAfterX, String line) { 
     lines.add(new LineForAnalysis(charAfterX, line)); 
    } 

    static class LineForAnalysis { 
     final char charAfterX; 
     final String line; 

     public LineForAnalysis(char charAfterX, String line) { 
      this.charAfterX = charAfterX; 
      this.line = line; 
     } 
    } 

    public void lineWithoutX(String line) { 
     analyzeAndClear(); 
    } 

    public void finish() { 
     analyzeAndClear(); 
    } 

    private void analyzeAndClear() { 
     if (!lines.isEmpty()) { 
      int ix1 = 0; 
      outerLoop: 
      while (ix1 < lines.size()) { 
       // see if a repeating pattern starts at ix1 
       for (int ix2 = ix1 + 1; ix2 < lines.size(); ix2++) { 
        if (lines.get(ix1).charAfterX == lines.get(ix2).charAfterX) { 
         int patternLength = ix2 - ix1; 
         int ix3 = ix2 + 1; 
         while (ix3 < lines.size() && lines.get(ix3).charAfterX == lines.get(ix3 - patternLength).charAfterX) { 
          ix3++; 
         } 
         int repeatedPatternLength = ix3 - ix1; 
         if (repeatedPatternLength > minRepeats * patternLength) { // pattern found 
          int repeats = repeatedPatternLength/patternLength; 
          // a more elaborate solution may return the repeating pattern to the caller 
          System.out.println("Found a pattern repeated " + repeats + " times"); 
          int repeatEndIndex = ix1 + repeats * patternLength; 
          for (int ix4 = ix1; ix4 < repeatEndIndex; ix4++) { 
           System.out.println(lines.get(ix4).line); 
          } 
          System.out.println(); 
          ix1 = repeatEndIndex; 
          continue outerLoop; 
         } 
        } 
       } 
       // no repeating pattern found, try next index 
       ix1++; 
      } 

      lines.clear(); 
     } 
    } 

} 
+0

ありがとうございます。申し訳ありませんが、要件に関するご意見にはお答えできませんでした。私は離れていた。あなたの解決策を試し、コメントを追加します。 – Jay