2

我正在尝试确定实现此代码的最快方法是什么:

Pattern ID_REGEX = Pattern.compile( "[A-Za-z0-9_\\-.]+" );
boolean match = ID_REGEX.matcher( id ).matches();
if ( !match ) throw new IllegalArgumentException("Disallowed character in ID");

鉴于 ID_REGEX 是恒定的,我会假设像 BitSet 或允许值的数组是实现这一点的最快方法,甚至可能只是一个巨大的 if 语句。

请注意,搜索是针对 A-Za-z,而不是Character.isLetter。

OSS 实施的额外荣誉

4

2 回答 2

3

我快速但不清楚的解决方案

// encapsulate this into a class and do once; perhaps use a static initializer
boolean[] allowed = new boolean[256]; // default false
allowed[32] = true;
allowed['a'] = true;
// fill all allowed characters
allowed['Z'] = true;

// the check
for (int n=0,len=str.length(); n<len; n++) {
  char ch = str.charAt(n);
  if (ch>255 || !allowed[ch]) {
    return false;
  }
}
return true;

可能需要一些额外的演员表,但我希望这个想法很清楚。

于 2013-10-15T17:36:37.500 回答
0

我想你可以遍历字符串,获取字符代码,与 ASCII 表代码进行比较。这样,对于每个字符,您有 3 个between比较(对于 az、AZ、0-9)和 6 个其他字符的常用整数比较。我认为这将是最快的。您也可以尝试多线程方法,在这种方法中您的做法基本相同,但在开始之前将问题分成几个部分并同时进行检查。
编辑(@krosenvold 评论后):多线程方法仅适用于非常大的字符串,因为创建线程有其自身的代价。

于 2013-10-15T17:10:27.917 回答