确定字符串是否仅包含允许值的最快方法?

时间:2013-10-15 16:53:09

标签: java

我正在尝试确定实现此代码的最快方式:

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实施的其他荣誉

2 个答案:

答案 0 :(得分: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;

可能需要一些额外演员阵容,但我希望这个想法很明确。

答案 1 :(得分:0)

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