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