2

当我阅读关于 Patterns 的 Holub 时,我发现我无法理解的代码。

代码看起来像这样,如果你愿意,你可以在这里阅读部分书籍。

/** 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方法以小写比较模式,这意味着它确实以不区分大小写的方式识别。

我在这里想念什么?

编辑

我在勘误表中搜索了这个(虽然不是官方的),但没有。很难将其视为勘误表。它多次提到这一点。

4

4 回答 4

1

我可以向您保证,此代码不区分大小写

我不在乎评论或书怎么说。

于 2012-09-22T11:24:36.290 回答
1

很难将其视为勘误表。

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

于 2012-09-22T11:41:28.513 回答
0

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

  1. 比较字符,一次一个,并允许将小写字母视为相同字母,仅大写字母。如果这些字符级别匹配中的每一个都相等,则整个字符串都匹配。
  2. 一开始将字符串和模式都小写,然后执行精确的字符匹配。

第一种情况不区分大小写,因为“这个字符与那个字符是否相同”问题忽略了字母的大小写。第二个可能区分大小写,因为测试确实考虑了大小写,尽管这个问题没有实际意义,因为您在测试之外将两个字符串都更改为小写。

于 2012-09-22T11:13:25.993 回答
0

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

于 2012-09-22T09:19:26.980 回答