我在做什么java.util.Scanner错误?

我在做什么java.util.Scanner错误?

问题描述:

这是我的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 
    } 
} 

这里有什么问题?

基本上你的正则表达式与:开头的字符串匹配,哪怕是只有一个字::表达式匹配以及: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

我不认为扫描仪类的工作你期待的方式..

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

你如何称呼scanner.useDelimiter("");?你的匹配器工作正常,如果你离开它..