以下のように複数の正規表現を使用したいのですが、どのようにフラット・マップ・イテレータに追加して、Java 8ストリームで複数のRegexを使って行からテキストを読み取る
String inFileName = "Sample.log";
String outFileName = "Sample_output.log";
try (Stream<String> stream = Files.lines(Paths.get(inFileName))) {
List<String> timeStamp = stream
.flatMap(s -> Stream.concat(quoteRegex1.results(s),
Stream.concat(quoteRegex2.results(s), quoteRegex3.results(s))))
.map(r -> r.group(1))
.collect(Collectors.toList());
timeStamp.forEach(System.out::println);
//Files.write(Paths.get(outFileName), dataSet);
}
が、これが意味するものではありかもしれないだけでその、各ラインを通じて3件の個別の検索を実行することに注意してください:
static String reTimeStamp="((?:2|1)\\d{3}(?:-|\\/)(?:(?:0[1-9])|(?:1[0-2]))(?:-|\\/)(?:(?:0[1-9])|(?:[1-2][0-9])|(?:3[0-1]))(?:T|\\s)(?:(?:[0-1][0-9])|(?:2[0-3])):(?:[0-5][0-9]):(?:[0-5][0-9]))";
static String reHostName="host=(\\\")((?:[a-z][a-z\\.\\d\\-]+)\\.(?:[a-z][a-z\\-]+))(?![\\w\\.])(\\\")";
static String reServiceTime="service=(\\d+)ms";
private static final PatternStreamer quoteRegex1 = new PatternStreamer(reTimeStamp);
private static final PatternStreamer quoteRegex2 = new PatternStreamer(reHostName);
private static final PatternStreamer quoteRegex3 = new PatternStreamer(reServiceTime);
public static void main(String[] args) throws Exception {
String inFileName = "Sample.log";
String outFileName = "Sample_output.log";
try (Stream<String> stream = Files.lines(Paths.get(inFileName))) {
//stream.forEach(System.out::println);
List<String> timeStamp = stream.flatMap(quoteRegex1::results)
.map(r -> r.group(1))
.collect(Collectors.toList());
timeStamp.forEach(System.out::println);
//Files.write(Paths.get(outFileName), dataSet);
}
}
この質問はあなたが単にストリームを連結することができMatch a pattern and write the stream to a file using Java 8 Stream
これは精巧です... – Eugene
素敵な説明です。 –
大きなファイル(5GB)でのみ読み込み中に奇妙な動作に気づいた場合、ストリームが2つのパターン(例えばStream.of(reTimeStamp、reHostName))と一致する場合、ストリームは10分以内にファイル全体を完璧に読み取ることができました出力を印刷します。 Stream.of(reTimeStamp、reHostName、reServiceTime)のような3番目のパターンを追加して、同じファイルに再度実行すると、ファイルがメモリに永久に保存され(VisualVMで監視され)、エラーでクラッシュしなくなります。これはStream.concat(regex1、regex2)の場合と同じように動作します。 Stream.concat(regex1、regex2、regex3) - Javaプロセスがハングします。 – Shan