我无法使用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)
答案 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