2009-08-16 5 views
1

패턴으로 컴파일하여 정규식을 구성하여 Fortran Real * 8 숫자를 찾습니다. 까다로운 비트는 내가에서 읽고 있어요 파일이 몇 백만 열 .. 단일 라인이 때문이다 나는이 작업을 수행 할 때 :Java.util.Scanner의 다음 (패턴) 메서드로 인한 트러블/혼란

Scanner recordScanner = new Scanner(recordString); 
String foundReal = recordScanner.findInLine(real8Regex); 

나는를 사용할 때 나는 내가 무엇을 찾고 얻을 수 있지만, 다음 (패턴) 메서드를 사용하면 InputMismatchException이 발생합니다 .. findInLine 및 다음 반환 문자열을 모두 고려하면 이상합니다.

Scanner recordScanner = new Scanner(recordString); 
String foundReal = recordScanner.next(real8Regex); 

나는 next() 메서드 사용에 중요한 것을 잃어 버렸습니까?

답변

3

"모든 토큰이 패턴과 일치하지 않으므로 next(Pattern)이 첫 번째 일치하지 않는 토큰에서 멈추는가"문제입니까?

String toSearch = "ab123d4e::g67f912g34h"; 
Scanner aScanner = new Scanner(toSearch); 
aScanner.useDelimiter("[a-z]+"); 
while (aScanner.hasNext("[0-9]+")) 
{ 
    System.out.println(aScanner.next("[0-9]+")); 
} 

을 하겠지만 만 일치하지 않는 제 토큰으로서 출력 (123) 및도 4는 종료 할 while 루프 발생 :

next(Pattern)

은 다음과 같이 사용될 수있다. 그러나이 시나리오에서는 대신 hasNext()next()을 사용해야합니다.

next(Pattern)을 사용하는 진정한 이유는 패턴과 일치하지 않는 첫 번째 토큰에서 멈추기 때문에 고민하고 있습니다. next(Pattern) 않습니다 뜻 "패턴과 일치하는 현재 위치 다음에 첫 번째 토큰을 반환"; 당신은 (아마도) 그렇게 hasNext()next()를 사용하는 것이 더 좋을 것 토큰을 모두 읽어 후 Matcher에 대하여를 사용할 필요가

을, 그것은 "그렇지 않으면 아무것도하지 않고는 패턴과 일치하는 경우 순서에서 다음 토큰을 반환"을 의미 당신이 발견, 마지막으로 각 토큰

에 대한 Pattern 수 있습니다 필요한 question 842496 유용

2

설명서가 훌륭하게 작성된 것은 아니지만 그것이 의미하는 바를 수행하고있는 것으로 보입니다.

next(pattern)이 스캐너의 현재 위치에서 발견되면 토큰을 반환하도록 문서화되었습니다. findInLine(pattern)은 패턴이 현재 줄 내에서 일치하지 않으면 null을 반환하는 것으로 문서화됩니다.

우선 확인하려면 next(pattern)으로 전화하기 전에 hasNext(pattern)을 사용하십시오.

+0

응답 주셔서 감사합니다. hasNext (Pattern)로 시도했을 때 응용 프로그램에서 아무 것도 찾지 못했습니다 ... If if (hasNext (Pattern)) 조건부를 Scanner의 while 루프로 묶습니다.hasNext() (공백 문자 인 내 분리 문자를 기반으로하는 다른 토큰이있는 경우 간단히 true), 코드는 CPU주기를 먹지만 결과를 반환하지 않습니다. – sbook

+1

예, hasNext가 스캐너를 진행하지 않기 때문입니다. 당신이 정말로 달성하기를 원하는 것이 분명하지 않습니다. 일부 샘플 코드가 도움이됩니다. –

1

난 조금 늦게 (당신은 그것을 "정규식"를 태그해야),하지만 당신은

String foundReal = recordScanner.findWithinHorizon(real8Regex, 0); 
를 사용한다3210

findInline(real8Regex)을 사용하면 현재 일치 항목이 마지막 항목과 동일한 줄에 있는지 확인하기 위해 스캐너가 불필요한 처리를 많이하게됩니다. 모든 데이터가 한 줄에 있다는 사실은 정확히 이 아니어야합니다. findInLine()을 사용해야합니다.