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)
来自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结果.
| 归档时间: |
|
| 查看次数: |
133 次 |
| 最近记录: |