2016-08-20 13 views
0

私はファイル内で特別なcharsequenceを見つけたいので、その出現箇所の行全体を読みたいと思います。Java、ファイル内のパターンを見つけて、行全体を読むにはどうすればいいですか?

次のコードは、最初の行をチェックして、この(最初の)行を取り出します。 どうすれば修正できますか?

Scanner scanner = new Scanner(file); 
    String output = ""; 

    output = output + scanner.findInLine(pattern) + scanner.next(); 

パターンと、ファイルが非常に実際に

に答えるこの上のコメントによると

+0

そして、あなたはその結果をどうするかをしたいですか?それらをリストで収集してください。 – fge

答えて

0

UPDATED ANSWERパラメータであり、使用されているものは、実際にしてPattern#compileメソッドを呼び出しScanner#findWithHorizon、ありますフラグのセット(Pattern#compile(String, int))。

この結果は、ファイルの行で入力テキストにこのパターンを何度も繰り返し適用しているようです。これはパターンが一度に複数の行にマッチすることはできないと考えています。

したがって:完全性については

public static final String findInFile(final Path file, final String pattern, 
    final int flags) 
    throws IOException 
{ 
    final StringBuilder sb = new StringBuilder(); 
    final Pattern p = Pattern.compile(pattern, flags); 

    String line; 
    Matcher m; 

    try (
     final BufferedReader br = Files.newBufferedReader(path); 
    ) { 
     while ((line = br.readLine()) != null) { 
      m = p.matcher(line); 
      while (m.find()) 
       sb.append(m.group()); 
     } 
    } 

    return sb.toString(); 
} 

私はいくつかの時間前に任意の長さのテキストファイルがCharSequenceとして読み取ることが、ここで大きな効果を使用することができたことができますパッケージを開発したことを追加する必要があります:https://github.com/fge/largetextMatcherは、Stringではなく、CharSequenceと一致するため、ここではうまく動作します。しかし、このパッケージにはいくつかの愛が必要です。ファイルにマッチする文字列のListを返す


一つの例は、指定できます

private static List<String> findLines(final Path path, final String pattern) 
    throws IOException 
{ 
    final Predicate<String> predicate = Pattern.compile(pattern).asPredicate(); 

    try (
     final Stream<String> stream = Files.lines(path); 
    ) { 
     return stream.filter(predicate).collect(Collectors.toList()); 
    } 
} 
+0

いいえ、その:http://pastebin.com/UpB1VtpF – rootBoy

+0

ですが、ありがとうございました:) – rootBoy

+0

あなたの問題をより正確に定義しないと、少ししか実行できません。 – fge

関連する問題