Java - 静态定义的字符列表

时间:2012-04-06 00:35:00

标签: java string character-class

在任何标准库中是否有字符类(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,所以评论很感激。)

5 个答案:

答案 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:] *”);