2011-02-05 4 views
4

텍스트 줄에는 "*(,identifier1*(identifier2"이 있고 단어 문자 ([a-zA-Z_0-9])로 정의 된 식별자를 읽고 싶습니다.다음 String 식별자를 가져 오기 위해 java.util.Scanner에서 어떤 패턴을 사용해야합니까?

어느 것을 사용해야합니까? 내가 사용하는 생각 :

scanner.next("[\\w]+"); 

하지만 java.util.InputMismatchException

+0

문자가 사용되는 것 :

import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { public static void main(String[] args) { List<String> words = extractWords("*(,identifier1*(identifier2"); for (String word : words) System.out.println(word); } public static List<String> extractWords(String input) { List<String> out = new ArrayList<String>(); Pattern re = Pattern.compile("\\w+"); Matcher matcher = re.matcher(input); while (matcher.find()) out.add(matcher.group()); return out; } } 

출력을 생성합니다 텍스트 소스의 구분 기호? InputMismatchException는 Scanner가 토큰을 String과 일치시킬 수 없다는 것을 나타냅니다. –

+0

구분 문자는 문자, 숫자 또는 밑줄이 아닌 문자입니다. 구분 기호는 여러 문자로 구성 될 수 있습니다. –

+1

@James, 유효한 정규식 패턴입니다. –

답변

5

스캐너의 기본 구분 기호가 공백 인 예외를 받고 있어요, 그래서 당신의 스캐너 객체에서 최초로 유일한 토큰이 전체 문자열 "*(,identifier1*(identifier2"입니다. 얻으려는 문자열 next("[\\w]+")을 호출하면 사용자 입력 내용과 일치하지 않으므로 예외가 throw됩니다.

은 무엇 후 당신은 더 findInLine("\\w+") 같은 :

identifier1 
identifier2 

를 또는 하나 이상의 비 (ASCII) 알파에 입력 문자열을 분할 할 경우 : 생산

Scanner scan = new Scanner("*(,identifier1*(identifier2"); 
System.out.println(scan.findInLine("\\w+")); 
System.out.println(scan.findInLine("\\w+")); 

-num-chars (및 _) 시도 :

Scanner scan = new Scanner("*(,identifier1*(identifier2").useDelimiter("\\W+"); 
while(scan.hasNext()) { 
    System.out.println(scan.next()); 
} 

이전과 같이 넣으십시오. 동일 내가 수도 W을 사용

참고 :

\W == [^\w] == [^a-zA-Z0-9_] 
+0

당신의 솔루션'findInLine'가 작동합니다. 'Scanner.next (regex)'가 읽지 못하면 예외를 던졌습니다 (!) –

+2

@John, 네, 스트림의 다음 토큰이 제공된 패턴과 일치하지 않으면 예외를 던집니다. 'scanner.next ("[\\ w] +");'를'scanner.next (". +");로 변경하면 첫 번째 토큰이 적절하게 일치합니다 (전체 입력 문자열과 같습니다). –

+0

구분 기호로 '\ W'를 사용하려면 +1하십시오. @ 존 : 바트의 코드로 예외를 받고 있습니까? –

1

당신이 스캐너를 사용해야하는 몇 가지 이유가없는 한, 당신은 당신이 원하는 곳에서 문자열을 얻을 후 직접 단어를 추출 할 수 있습니다. 물론 이것은 스캐너가 한 번에 하나의 읽을있는 반면, 한 번에 메모리에 모든 단어를로드 :

identifier1 
identifier2 
+0

큰 파일을 읽고 있기 때문에 옵션이 아닙니다. 그러나 당신의 솔루션은 흥미 롭습니다. +1. –

관련 문제