2009-08-03 2 views
1

입력 텍스트의 행과 특정 항목을 일치시켜야합니다. 줄은 다음과 같습니다.Java에서 스캐너를 사용하여 행의 토큰을 일치시키는 데 문제가 있습니다.

to be/ Σ _ Σ [1pos, 1neg] {0=1, 2=1} 

저는 스캐너 클래스를 사용하여 텍스트의 각 줄을 읽었으며 다음 코드를 작성했습니다. 그러나 "~"이 줄에 포함되어 있기 때문에 "~"의 줄이 일치하지 않아 뭔가가 제대로 작동하지 않습니다. 줄에 "to"가 포함되어 있기 때문에 ("to" 그러나 아무것도) 일치하지 않습니다 :

Scanner scanner = new Scanner(file); 
while(scanner.hasNext()) { 
     String line = scanner.nextLine(); 
     System.out.println("line: " + line); 
     Pattern p_pos = Pattern.compile("to"); 
     Matcher m_pos = p_pos.matcher(line); 
     String match = m_pos.group(0); 
     System.out.println("match: " + match); 
     boolean b_pos = m_pos.matches(); 
     if(b_pos) { 
      System.out.println(match); 
     } 
} 

출력 :

line: to be/ Σ _ Σ [1pos, 1neg] {0=1, 2=1} 
Exception in thread "main" java.lang.IllegalStateException: No match found 
    at java.util.regex.Matcher.group(Matcher.java:485) 
    at lady.PhrasesFromFile.readFile(PhrasesFromFile.java:31) 
    at lady.PhrasesFromFile.main(PhrasesFromFile.java:17) 

나는이 하나 더 질문 : 내가 처음까지 라인의 처음부터 모든 것을 저장할 수 있도록 내가 선을 처리 할 수있는 방법 "/" 상징? API에서 그 방법을 찾지 못했습니다. 그렇게 할 수 있습니까? 나는 기본적으로 줄을 훑고, 여러 변수에 줄을 저장 한 다음이 변수의 값을 사용하기를 연속적으로 원합니다. 첫 번째 "/"기호 앞에 얼마나 많은 토큰이 있는지 모르기 때문에 next()를 특정 횟수만큼 사용할 수 없습니다.

미리 감사드립니다.

답변

1

.matches()전체 입력란과 일치합니다. 입력 문자열의 일부와 일치 시키려면 .find()을 사용하고 입력 문자열의 시작을 일치 ​​시키려면 .lookingAt()을 사용하십시오. 당신이 일치하는 그룹 포함하도록 패턴을 확장하면

http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Matcher.html

또한, 당신은 문자열을 검색하는 성공적인 경기 후 .group() 기능을 사용할 수 있습니다 (일치하는 그룹이 작동하는 방법에 대한 자세한 내용은 일반적인 정규식 참조를 참조하십시오) 패턴 내의 특정 그룹과 일치합니다. 당신은을 사용하여 당신이 토큰에 필요한 부분을 추출 할 수

1

: 그건 분명히

Pattern.compile("\\w+").matcher(tokenSection).find(); 

를 사용하여 토큰을 추출하는 동안

String tokenSection = Pattern.compile("(to\\s+.*?)/").matcher(line).find().group(1); 

을 다음 루핑 위를 연결하지 것이다 바로 코드 조각들.

관련 문제