在任何标准库中是否有字符类(alpha,numeric,alphanumeric)的定义?我正在检查字符串是否只包含字母数字字符或冒号:
StringUtils.containsOnly(input, ALPHA_NUMERIC + ":");
我自己可以定义ALPHA_NUMERIC,但似乎常见的字符类将在标准库中定义,尽管我无法找到定义。
编辑:我确实考虑过正则表达式,但对于我的特定用例,执行时间很重要,简单的扫描更有效。
编辑:以下是测试结果,使用Regex,CharMatcher和简单扫描(每次测试使用相同的有效/无效输入字符串集):
有效输入字符串:
CharMatcher ,Num Runs:1000000,Valid Strings:true,Time(ms): 1200
正则表达式,Num运行:1000000,有效字符串:true,时间(ms): 909
扫描,Num运行:1000000,有效字符串:true,时间(ms): 96
输入字符串无效:
CharMatcher ,Num Runs:1000000,Valid Strings:false,Time(ms): 277
正则表达式,Num运行:1000000,有效字符串:false,时间(ms): 253
扫描,Num运行:1000000,有效字符串:false,时间(ms): 36
以下是执行扫描的代码:
public boolean matches(String input) {
for(int i=0; i<input.length(); i++) {
char c = input.charAt(i);
if( !Character.isLetterOrDigit(c) && c != ':') {
return false;
}
}
return true;
}
编辑:我重新编译为独立程序(我正在通过eclipse运行):
CharMatcherTester,Num Runs:1000000,Valid Strings:true,Time(ms):418
RegexTester,Num Runs:1000000,Valid Strings:true,Time(ms):812
ScanTester,Num Runs:1000000,Valid Strings:true,Time(ms):88
CharMatcherTester,Num Runs:1000000,Valid Strings:false,Time(ms):142
RegexTester,Num Runs:1000000,Valid Strings:false,Time(ms):223
ScanTester,Num Runs:1000000,Valid Strings:false,Time(ms):32
来源:https://bitbucket.org/jdeveloperw/testing(这是我第一次将测试结果发布到SO,所以评论很感激。)
答案 0 :(得分:5)
你最好的选择可能是正则表达式Pattern。
它应匹配:
[\p{Alnum}:]*
\p{Alnum}
- ASCII字母数字[]
- 字符类(里面的任何字符都匹配一个字符):
- 字面意思:*
- 0或更多如果它都是字母数字(或:)。
您可以使用matches或预编译正则表达式。
答案 1 :(得分:2)
当你谈论regex
时它确实存在,在这种情况下,字符类\w
代表那个。这就是String类具有matches方法的原因。
edit:添加匹配方法时,StringUtils类可能早于Java 1.4。 Apache Commons类提供的许多功能已经折叠到标准库中。当你必须使用旧版本的Java或使用不在标准库中的东西时,它们仍然有用,但这似乎不是其中一种情况。
答案 2 :(得分:2)
尝试使用正则表达式:
boolean containsOnlyAlphanumeric = input.matches("[\\p{Alnum}:]+");
编辑:
为了获得最佳性能,您可以预编译模式,将其存储在静态定义的模式常量中,并在必要时重复使用它:
// part of the class declaration
private static final Pattern ALPHANUMERIC_PLUS_COLON = Pattern.compile("[\\p{Alnum}:]+");
// whenever you need to check if the input matches the pattern
boolean containsOnlyAlphanumeric = ALPHANUMERIC_PLUS_COLON.matcher(input).matches();
我同意Matthew Flaschen,你不应该立即丢弃正则表达式,一个精心构建的,预编译的正则表达式,如果不比检查输入字符串中所有可能有效字符的扫描速度快,也可以快。基准第一!
答案 3 :(得分:1)
Guava's CharMatcher
几乎完全您要求的内容。这是wiki article。 (披露:我向Guava捐款。)
CharMatcher matcher = CharMatcher.JAVA_LETTER_OR_DIGIT.or(
CharMatcher.is(':'));
return matcher.matchesAllOf(string);
答案 4 :(得分:0)
正则表达式匹配可以完成这项工作。例如MyString.matches(“[a-zA-Z0-9:] *”);