我在做什么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("(;|:)[^;:]*");
答
我不认为扫描仪类的工作你期待的方式..
Scanner scanner = new Scanner(":alpha;beta");
scanner.useDelimiter("(;|:).*?");
System.out.println(scanner.next()); // gives alpha
答
你如何称呼scanner.useDelimiter("");
?你的匹配器工作正常,如果你离开它..
@chiccodoro,解释看起来是正确的,但它不会改变代码的行为:(我仍然得到相同的结果,即使与'“(; |:)[^ ;:] *“' – yegor256 2010-09-23 10:07:05
@Vincenzo:可能是Java特有的,默认情况下它不会贪婪?然后我建议将问题的标题改为”正则表达式不符合预期“。这更容易理解,因为java.util.Scanner并不像正则表达式那样出名。此外,在你的问题中包含这些新发现。 – chiccodoro 2010-09-23 10:26:02
@Vincenzo:如果你说'“(; |:)[^ ;:] + “'(注意最后加号)? – chiccodoro 2010-09-23 10:27:07