2016-12-11 1 views
0

나는 샘플 입력 파일이 -구분 기호와 함께 java에서 tokenizer를 사용하는 방법은 무엇입니까? 다음과 같이

OPCODE R1, R2, R3
OPCODE R2, # 내가 무엇입니까 토큰을 인쇄하려고 30

while(scanner.hasNextLine()){ 
    StringTokenizer st = new StringTokenizer(scanner.nextLine()); 
    Instruction instruction = new Instruction(); 
    instruction.setAddress(PC + PC_increment); 
    instruction.setOpcode(st.nextToken()); 
    if(st.hasMoreTokens()) { 
     instruction.setDest(st.nextToken()); 
    } 
    if(st.hasMoreTokens()) { 
     String nextToken = st.nextToken(); 
     if(nextToken.charAt(0)== '#') { 
      instruction.setSource_1(nextToken.split("#")[1]); 
     } 
     else { 
      instruction.setSource_1(nextToken); 
     } 
    } 
    if(st.hasMoreTokens()) { 
     instruction.setSource_2(st.nextToken()); 
    } 
} 

"R1"및 "R2"를 출력으로 사용합니다. 그러나, 나는 R1 또는 R2를 출력으로 기대하고있다. 또한, 나는 두 번째 라인의 경우에 #을 원하지 않는다. 내가 어떻게 해? 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

0

StringTokenizer의 기본 구분 기호는 공백 문자 (공백, 탭, 개행) 이 아니며이 아닌 쉼표 ,입니다. 첫 번째 줄의 토큰은 OPCODE, R1, R2, R3입니다.

당신은 공백 과에 문자열을 분할 할 경우 (구분 기호의 기본 목록의 마지막에 추가 된 ,주의)를 사용한다 쉼표 : 선도 #을 제거하기 위해 또한

StringTokenizer st = new StringTokenizer(scanner.nextLine(), " \t\n\r\f,"); 

, 당신은 단지 당신이 JDK documentation를 읽으면 기록 된,

if(nextToken.startWith("#")) { 
    instruction.setSource_1(nextToken.substring(1)); 
} 

을하지만 수 :

StringTokenizer는 새 코드에서 사용을 권장하지 않지만 호환성 이유로 보존되는 레거시 클래스입니다. 이 기능을 사용하려는 사람은 String의 split 메소드 나 java.util.regex 패키지를 대신 사용하는 것이 좋습니다.

0

StringTokenizer 클래스는 현재 제공되지 않습니다. String 클래스 나 regex (정규식)의 split() 메소드를 사용하는 것이 좋습니다.

코드에서 토큰 사이의 구분은 쉼표 (",")입니다. 그렇다면 문자열 토큰 화기에서 기본 토큰 분리 기호는 "공백"입니다. 따라서 으로해야합니다. StringTokenizer st = new StringTokenizer (scanner.nextLine(), ",");

거꾸로 쉼표로 언급 한 내용은 토큰 사이의 분리 자 역할을합니다.

또한 "#"을 제거하기 위해 subString 메서드를 사용할 수 있습니다.

관련 문제