我使用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
在编译任何模式之前,所有涉及的字符串都已被修剪。
有人能指出我在这里失踪的是什么吗?
非常感谢。
答案 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("");