텍스트 줄에는 "*(,identifier1*(identifier2
"이 있고 단어 문자 ([a-zA-Z_0-9]
)로 정의 된 식별자를 읽고 싶습니다.다음 String 식별자를 가져 오기 위해 java.util.Scanner에서 어떤 패턴을 사용해야합니까?
어느 것을 사용해야합니까? 내가 사용하는 생각 :
scanner.next("[\\w]+");
하지만 java.util.InputMismatchException
텍스트 줄에는 "*(,identifier1*(identifier2
"이 있고 단어 문자 ([a-zA-Z_0-9]
)로 정의 된 식별자를 읽고 싶습니다.다음 String 식별자를 가져 오기 위해 java.util.Scanner에서 어떤 패턴을 사용해야합니까?
어느 것을 사용해야합니까? 내가 사용하는 생각 :
scanner.next("[\\w]+");
하지만 java.util.InputMismatchException
스캐너의 기본 구분 기호가 공백 인 예외를 받고 있어요, 그래서 당신의 스캐너 객체에서 최초로 유일한 토큰이 전체 문자열 "*(,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_]
당신의 솔루션'findInLine'가 작동합니다. 'Scanner.next (regex)'가 읽지 못하면 예외를 던졌습니다 (!) –
@John, 네, 스트림의 다음 토큰이 제공된 패턴과 일치하지 않으면 예외를 던집니다. 'scanner.next ("[\\ w] +");'를'scanner.next (". +");로 변경하면 첫 번째 토큰이 적절하게 일치합니다 (전체 입력 문자열과 같습니다). –
구분 기호로 '\ W'를 사용하려면 +1하십시오. @ 존 : 바트의 코드로 예외를 받고 있습니까? –
당신이 스캐너를 사용해야하는 몇 가지 이유가없는 한, 당신은 당신이 원하는 곳에서 문자열을 얻을 후 직접 단어를 추출 할 수 있습니다. 물론 이것은 스캐너가 한 번에 하나의 읽을있는 반면, 한 번에 메모리에 모든 단어를로드 :
identifier1
identifier2
큰 파일을 읽고 있기 때문에 옵션이 아닙니다. 그러나 당신의 솔루션은 흥미 롭습니다. +1. –
문자가 사용되는 것 :
출력을 생성합니다 텍스트 소스의 구분 기호? InputMismatchException는 Scanner가 토큰을 String과 일치시킬 수 없다는 것을 나타냅니다. –
구분 문자는 문자, 숫자 또는 밑줄이 아닌 문자입니다. 구분 기호는 여러 문자로 구성 될 수 있습니다. –
@James, 유효한 정규식 패턴입니다. –