2010-09-23 83 views
2

這是我的Java 1.5的代碼(完整的示例):我在做什麼java.util.Scanner錯誤?

import org.junit.Test; 
import static org.junit.Assert.*; 
import java.util.Scanner; 
import java.util.regex.Pattern; 
public class StrangeTest { 
    @Test 
    public void testRegExp() { 
    Pattern re = Pattern.compile("(;|:)[^:;]*"); 
    Scanner scanner = new Scanner(":alpha"); 
    scanner.useDelimiter(""); 
    assertEquals(":alpha", scanner.next(re)); // failure 
    } 
} 

這裏有什麼問題?

回答

3

基本上你的正則表達式與:開頭的字符串匹配,哪怕是隻有一個字::表達式匹配以及:a:al,... :alpha。即使是:alpha;beta是一場比賽!

與你添加到你的表達問號你來了non-greedy,即最短可能的字符串匹配,這是:

刪除問號,使其貪婪

Pattern re = Pattern.compile("(;|:).*"); 

然而,那麼它將匹配:alpha;beta,所以你需要指出的是,繼分號或冒號字符,你期望的任何字符分號或冒號:

Pattern re = Pattern.compile("(;|:)[^;:]*"); 
+0

@chiccodoro,解釋看起來是正確的,但它不會改變代碼的行爲:(我仍然得到相同的結果,即使與'「(; |:)[^ ;:] *「' – yegor256 2010-09-23 10:07:05

+0

@Vincenzo:可能是Java特有的,默認情況下它不會貪婪?然後我建議將問題的標題改爲」正則表達式不符合預期「。這更容易理解,因爲java.util.Scanner並不像正則表達式那樣出名。此外,在你的問題中包含這些新發現。 – chiccodoro 2010-09-23 10:26:02

+0

@Vincenzo:如果你說'「(; |:)[^ ;:] + 「'(注意最後加號)? – chiccodoro 2010-09-23 10:27:07

1

我不認爲掃描儀類的工作你期待的方式..

Scanner scanner = new Scanner(":alpha;beta"); 
scanner.useDelimiter("(;|:).*?"); 
System.out.println(scanner.next()); // gives alpha 
0

你如何稱呼scanner.useDelimiter("");?你的匹配器工作正常,如果你離開它..