Java扫描程序不匹配方括号

时间:2015-06-04 09:26:20

标签: java java.util.scanner

我无法使用Java中的扫描程序解析类似python的列表。出于某种原因,我在尝试检测方括号时似乎做错了什么。让我最困惑的是,似乎输入中方括号的出现会触发不必要的行为。

Scanner scanner1 = new Scanner("a[");
assert(scanner1.hasNext("a\\[")); // Does not trigger assertion

Scanner scanner2 = new Scanner("[[0]]");
assert(scanner2.hasNext("\\["));  // Triggers assertion, but why?

Scanner scanner3 = new Scanner(" a[[[0]]");
assert(scanner3.hasNext("a\\[")); // Triggers assertion, but why?

这是使用

openjdk version "1.8.0_45"
OpenJDK Runtime Environment (build 1.8.0_45-b14)
OpenJDK 64-Bit Server VM (build 25.45-b02, mixed mode)

2 个答案:

答案 0 :(得分:1)

<强>扫描仪

扫描程序会将输入拆分为标记,由分隔符(很好的解释http://www.tutorialspoint.com/java/util/java_util_scanner.htm)拆分,默认情况下它是一个空格。由于您没有任何分隔字符,因此第一个标记是整个字符串,因此hasNext中的模式应该与整个字符串匹配,而不仅仅是部分字符串。

解决方案:您需要创建正确的Regexp语法以匹配整个字符串

Scanner scanner1 = new Scanner("a[");
assert(scanner1.hasNext("a\\[")); 

Scanner scanner2 = new Scanner("[[0]]");
assert(scanner2.hasNext("\\[.*"));  

Scanner scanner3 = new Scanner(" a[[[0]]");
assert(scanner3.hasNext("a\\[.*")); 

另一种方法是使用findInLine

Scanner scanner2 = new Scanner("[[0]]");
String inline = scanner2.findInLine("\\[.*"));  
assert(inline!=null);

答案 1 :(得分:1)

扫描程序的默认分隔符是一个空格,因此在第一种情况下会找到标记“a [”,但在其他情况下,标记不匹配,因为找不到预期的标记:[是与[[0]]不同。

例如,添加所需的空格:

public static void main (String[] args) throws java.lang.Exception  {
    Scanner scanner1 = new Scanner("a[");
    System.out.println(scanner1.hasNext("a\\[")); //true        
    Scanner scanner2 = new Scanner("[ [0]]");
    System.out.println(scanner2.hasNext("\\["));  //true
    Scanner scanner3 = new Scanner(" a[ [ [0]]"); 
    System.out.println(scanner3.hasNext("a\\[")); //true
}

换句话说,预期令牌必须完全匹配,而不是部分匹配,并且必须正确定义分隔符。您可以使用此代码here