다음과 같이 정규 표현식을 하나 이상 갖고 싶습니다. 단일 스트림을 읽는 동안 행의 일치하는 모든 값을 List에 넣으려면 어떻게해야합니까?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);
}
그러나 이것은 의미 수뿐만 아니라, 이는 각 라인을 통해 세 가지 개별 검색을 수행합니다 참고 :
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)와 같은 세 번째 패턴을 추가하고 같은 파일 java 프로세스에서 다시 실행하는 순간 메모리에 파일을 영원히 보관 (VisualVM을 통해 모니터링)하여 오류가 발생하지 않고 중단됩니다. 이것은 Stream.concat (regex1, regex2) - 작동 방식과 동일합니다. Stream.concat (regex1, regex2, regex3) - Java 프로세스가 중단됩니다. – Shan