2011-02-10 3 views
1

일련의 정규 표현식을 사용하여 파일의 토큰을 구문 분석하려고합니다. 줄 바꿈을 세어야하고 그 사이에 공백이없는 토큰을 분리 할 수 ​​있어야합니다. 불행히도 java.util.Scanner의 findWithinHorizon() 메소드는 입력 스트림의 나머지 부분 (최대 수평선까지)을 정규식 일치의 START에 대해 검색하지만 현재 파일 위치에서 시작하는 정규식과 일치 시키려고합니다. 구체적으로 말하자면, 나는 정규식을 가지고 있고 어떤 파일이 현재 위치에있는 파일인지 확인한 다음 파일 위치를 정규식 일치 직후로 진행하고 계속 진행합니다. 이것이 가능한가?regex를 사용하여 Java에서 파일을 구문 분석하는 방법은 무엇입니까?

스캐너의 next() 메소드는 구분 기호를 적용하고 정규 표현식이 전체 토큰과 일치해야하므로 쓸모없는 것처럼 보입니다. 현재 파일 위치에서 일치시키고, 일치하는 문자열을 얻고, 일치 후 파일 탐색을 진행시키고 싶습니다.

+0

? 즉시 메모리에 읽을 수 있습니까? –

답변

0

옵션 :

  1. 문자열로 메모리에 전체 파일을 읽어보십시오. 그런 다음 원하는 위치에서 직접 Matcher을 사용하십시오.

  2. RandomAccessFile에서 얻은 FileChannelScanner의 입력으로 사용하십시오. 그런 다음 채널의 위치를 ​​직접 조작 할 수 있습니다.

  3. 위와 같이 FileChannel을 사용하지만 유연성을 높이기 위해 Matcher을 직접 사용하십시오.

RandomAccessFile에와 정규를 사용하는 예 :

이 파일이 얼마나 큰
FileChannel fc = file.getChannel(); 
fc.lock(); // so it doesn't change under you 

ByteBuffer bb = ByteBuffer.allocate(BUFFER_SIZE); 
CharBuffer cb = bb.asCharBuffer(); 

fc.read(bb); 
Matcher matcher = pattern.matcher(cb); 
// etc. 
+0

예 파일을 메모리로 읽을 수 있습니다. 두 번째 방법은 현재 위치에서 구분 기호없이 일치시키기 위해 스캐너를 어떻게 사용합니까? 첫 번째와 세 번째 방법에 대해 Matcher가 현재 위치에서 시작하여 일치 문자열을 얻고 다음 경기를 위해 Matcher를 넘어서는 것을 어떻게 설명합니까? 감사합니다 – MMM

+0

@MMM - 분리 기호를 찾는 것이 전체 목적이므로 '스캐너'에게 구분 기호를 무시하도록 말할 수는 없습니다. – OrangeDog

+0

@MMM - 일치 위치는'Matcher.region()'으로 제어 할 수 있습니다. – OrangeDog

관련 문제