Java:Pattern在Scanner中的行为有所不同

Via*_*lov 3 java regex java.util.scanner

遇到了Java中正则表达式匹配的奇怪行为.第一个输出命令true按预期打印,但是当打包相同的字符串时Scanner,输出为false.我究竟做错了什么?

public static void main(String[] args) {
  Pattern p = Pattern.compile(" *\\[");
  System.out.println(p.asPredicate().test("[]")); //true

  Scanner s = new Scanner("[]");
  System.out.println(s.hasNext(" *\\[")); //false
}
Run Code Online (Sandbox Code Playgroud)

Psh*_*emo 6

来自public boolean hasNext(String pattern) 文档:

如果下一个标记与从指定字符串构造的模式匹配,则返回true.

这里的下一个标记[]不仅仅是[(因为分隔符是一个或多个空格),但" *\\["模式与该标记完全]匹配(不匹配),因此您可以通过结果通知它false.

如果要检查令牌是否以[您的方式开头,可以.*在模式的末尾添加以使其与令牌的其余部分匹配.您也可以删除,*因为空格是默认分隔符,因此它不能成为令牌的一部分.


的情况下

Pattern p = Pattern.compile(" *\\[");
System.out.println(p.asPredicate().test("a[]")); //true
Run Code Online (Sandbox Code Playgroud)

如果您看一下代码,asPredicate您会看到它实现为:

public Predicate<String> asPredicate() {
    return s -> matcher(s).find();
}
Run Code Online (Sandbox Code Playgroud)

find()方法不检查整个字符串是否与模式匹配,但是尝试查找与模式匹配的部分字符串.由于[]包含零个或多个空格,因此[您将看到true结果.