不区分大小写的匹配方法

时间:2012-09-22 09:00:06

标签: java case-sensitive

当我正在阅读Holub on Patterns时,我发现了无法理解的代码。

代码如下所示,如果您愿意,可以阅读here中的部分内容。

/** Matches a simple symbol that doesn't have to be on a "word"
 *  boundary; punctuation, for example. SimpleToken
 *  is very efficient, but does not recognize characters in
 *  a case-insensitive way, as does {@link WordToken} and
 *  {@link RegexToken}.
 *
 *  @include /etc/license.txt
 */

public class SimpleToken implements Token
{   
  private final  String     pattern;

  /** Create a token.
   *  @param pattern a string that defines a literal-match lexeme.
   */

  public SimpleToken( String pattern )
  { this.pattern = pattern.toLowerCase();
  }

  public boolean match( String input, int offset )
  { return input.toLowerCase().startsWith( pattern, offset );
  }

  public String lexeme()  { return pattern; }
  public String toString(){ return pattern; }
}

评论(和书)说SimpleToken类“以不区分大小写的方式识别字符”,但match方法比较小写的模式,这意味着它 以不区分大小写的方式识别。

我在这里缺少什么?

修改

我在errata list搜索了这个(虽然不是官方的),但没有。并且很难将其视为勘误。它说了好几次。

4 个答案:

答案 0 :(得分:1)

我可以向您保证,此代码不敏感地匹配案例

我不在乎评论或书中说的是什么。

答案 1 :(得分:1)

  

很难将此视为勘误。

尽管如此,这本书是不正确的。代码明显地以不区分大小写的方式匹配令牌,您的实验证实了这一点。即使是作者(及其编辑)也会犯错误。

答案 2 :(得分:0)

显然是搜索is case-insensitive。我可以推测的是can be bugs everywhere javadocs中的and in books,只有通过查看javadocs(和not at exact code)才能构建。

答案 3 :(得分:0)

有两种方法可以进行匹配:

  1. 一次比较一个字符,并允许将小写字母视为相同的字母,只是大写。如果每个字符级别匹配相等,则整个字符串匹配。
  2. 在开始时小写字符串和模式,然后执行完全匹配的字符。
  3. 第一种情况是不区分大小写的,因为“这个字符与该字符相同”问题忽略了字母的情况。第二个可能区分大小写,因为测试确实考虑了大小写,尽管这个问题没有实际意义,因为您在测试之外将两个字符串都更改为小写。