Matcher lookingAt方法匹配空字符串

时间:2014-07-24 20:20:47

标签: java regex

我使用Matcher实例使用lookingAt()方法匹配某些输入开头的模式。但是,当我从空字符串创建lookingAt()并尝试将其与非空(修剪)字符串匹配时,Pattern返回true。

首先,这正如我所料:

String field = "Dave went to Alabama"

String escapedQuery = Pattern.quote("Dave went");
Pattern pattern = Pattern.compile(escapedQuery, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(field);
// matcher.lookingAt() == true

但是,从空String生成的这种模式也会返回true:

String escapedQuery = Pattern.quote("");
Pattern pattern = Pattern.compile(escapedQuery, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(field);
//matcher.lookingAt() == true

在编译任何模式之前,所有涉及的字符串都已被修剪。

有人能指出我在这里失踪的是什么吗?

非常感谢。

2 个答案:

答案 0 :(得分:1)

这是一致性问题。空模式就像空字符串,如果你尝试

System.out.println( "abc".indexOf("") );

你会发现这是在偏移0处找到的。

显然,在长度为>的字符串内的许多地方都有一个长度为0的子字符串。 0,甚至是长度为0的字符串!

答案 1 :(得分:0)

空正则表达式匹配所有字符串。如果你想要一个只匹配空字符串的正则表达式,你需要这样的东西:

Pattern pattern = Pattern.compile("^$", Pattern.CASE_INSENSITIVE);

^匹配字符串的开头,$匹配结尾。因此,表达式^$匹配开始然后立即结束的字符串;即空字符串。

当然有更好的方法来匹配空字符串。这些让人想起:

string.length() == 0
string.equals("");