我在java.util.Scanner中做错了什么?

时间:2010-09-23 09:16:37

标签: java

这是我的Java 1.5代码(完整示例):

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 个答案:

答案 0 :(得分:3)

基本上,您的正则表达式匹配任何以:开头的字符串,即使它只有一个字符::匹配表达式以及:a:al ,...... :alpha。即使:alpha;beta也匹配!

如果您在表达式中附加了问号,则表明 non-greedy ,即最短可能的字符串匹配,即:

删除问号以使其贪婪

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

然而,它会匹配:alpha;beta,所以你需要指出,在分号或冒号后面,你需要任何字符除了分号或冒号:

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

答案 1 :(得分:1)

我不认为Scanner类的工作方式与您期望的相符......

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

答案 2 :(得分:0)

您如何证明致电scanner.useDelimiter("");?如果你把它放在一边,你的匹配工作正常。