2009-08-03 49 views
1

我需要匹配輸入文本行中的某些內容。該線路是這樣的:使用Java中的掃描器在一行中匹配令牌的問題

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

我使用的掃描器類閱讀文本的每一行,我寫了下面的代碼。然而,有些東西不能正常工作,因爲patter「to」與該行不匹配,應該是,因爲「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

您可以通過使用提取您需要的標記部分:

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

,然後遍歷,要使用

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

顯然提取令牌,你就不會堵塞以上代碼正確英寸