Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-静态定义的字符列表_Java_String_Character Class - Fatal编程技术网

Java-静态定义的字符列表

Java-静态定义的字符列表,java,string,character-class,Java,String,Character Class,在任何标准库中是否有字符类的定义(字母、数字、字母数字)?我正在检查字符串是否只包含字母数字字符或冒号: StringUtils.containsOnly(input, ALPHA_NUMERIC + ":"); 我可以自己定义字母数字,但似乎普通字符类将在标准库中定义,尽管我无法找到定义 编辑:我确实考虑过正则表达式,但是对于我的特定用例来说,执行时间很重要,简单的扫描更有效。 编辑:以下是使用Regex、CharMatcher和简单扫描(为每个测试使用相同的有效/无效输入字符串集)的测试结

在任何标准库中是否有字符类的定义(字母、数字、字母数字)?我正在检查字符串是否只包含字母数字字符或冒号:

StringUtils.containsOnly(input, ALPHA_NUMERIC + ":");
我可以自己定义字母数字,但似乎普通字符类将在标准库中定义,尽管我无法找到定义

<>编辑:我确实考虑过正则表达式,但是对于我的特定用例来说,执行时间很重要,简单的扫描更有效。 编辑:以下是使用Regex、CharMatcher和简单扫描(为每个测试使用相同的有效/无效输入字符串集)的测试结果:

有效输入字符串:

CharMatcher,运行次数:1000000,有效字符串:true,时间(ms):1200

Regex,运行次数:1000000,有效字符串:true,时间(ms):909

扫描,运行次数:1000000,有效字符串:true,时间(毫秒):96

无效的输入字符串:

CharMatcher,运行次数:1000000,有效字符串:false,时间(毫秒):277

Regex,运行次数:1000000,有效字符串:false,时间(ms):253

扫描,运行次数:1000000,有效字符串:false,时间(毫秒):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;
}
公共布尔匹配(字符串输入){

对于(inti=0;i而言,您的最佳选择可能是正则表达式

它应该匹配:

[\p{Alnum}:]*
  • \p{Alnum}
    -ASCII字母数字
  • []
    -字符类(其中的任何字符都将匹配一个字符)
  • -文字:
  • *
    -0或更多
如果全部为字母数字(或:)


您可以使用或预编译正则表达式。

当您谈论
regex
时,它确实存在,在这种情况下,字符类
\w
就表示了这一点。这就是为什么String类具有该方法


编辑:当添加matches方法时,StringUtils类可能早于Java 1.4。Apache Commons类提供的许多功能已经被折叠到标准库中。当您必须使用旧版本的Java或使用标准库中没有的东西时,它们仍然很有用,但这确实有用似乎不属于这种情况。

试试这个,使用正则表达式:

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的观点,您不应该立即丢弃正则表达式,一个构建良好的预编译正则表达式可以与检查输入字符串中所有可能的有效字符的扫描一样快,如果不快的话。首先进行基准测试!

正则表达式匹配就可以完成这项工作。例如MyString.matches([a-zA-Z0-9:*”)

正是你想要的。以下是消息。(披露:我为番石榴捐款。)


据我所知,没有这样的图书馆。这就是你要找的吗?还有,你认为“SuoOuuSuthOnthuxi…席”吗?按字母顺序排列?不。这包括下划线,但不包括冒号。是的,你必须像OP当前所做的那样将冒号添加到模式中。但是你对下划线的看法是正确的,我已经忘记了。^和$是Java中的行首和行尾,而不是输入。@MatthewFlaschen它是固定的。你是对的,
^
d
$
在使用
匹配()时是不必要的。
谢谢,我不确定默认情况下它是否匹配整个字符串。@MatthewFlaschen是的。它在
匹配器中调用该方法,javadocs声明它“尝试根据模式匹配整个区域”。我确实想过使用正则表达式,但对于我的特定用例,执行时间很重要,简单的扫描更有效。基准测试是一个好主意;我将比较CharMatcher、正则表达式和扫描,并在有一点空闲时发布结果。基准测试的结果已经发布。我还可以提供用于testin的完整代码g、 资料来源:(如能就如何改进基准提出任何意见,我将不胜感激。)
CharMatcher matcher = CharMatcher.JAVA_LETTER_OR_DIGIT.or(
  CharMatcher.is(':'));
return matcher.matchesAllOf(string);