我正在尝试确定实现此代码的最快方式:
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实施的其他荣誉
答案 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评论之后):多线程方法仅适用于非常大的字符串,因为创建线程有自己的价格。