Java 扫描器不匹配方括号

Java scanner won't match square brackets

我在 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)

扫描仪

A Scanner 确实将输入拆分为标记,由分隔符分隔(很好的解释 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);

Scanner 的默认定界符是空格,因此在第一种情况下找到了标记 "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