Java,确保字符串仅包含字母数字、空格和破折号

Posted

技术标签:

【中文标题】Java,确保字符串仅包含字母数字、空格和破折号【英文标题】:Java, Make sure a String contains only alphanumeric, spaces and dashes 【发布时间】:2010-10-19 11:34:52 【问题描述】:

在 Java 中,我需要确保字符串仅包含 alphanumericspacedash 字符。

我找到了org.apache.commons.lang.StringUtils 类和几乎足够的方法isAlphanumericSpace(String)...但我还需要包含破折号。

最好的方法是什么?我不想使用正则表达式。

【问题讨论】:

我还在同一个库中看到了方法 containsOnly(String, char[]),但这意味着我必须列出整个字母表,从 0 到 9 的数字以及一个空格和一个破折号...对于我需要做的事情来说似乎有点过于明确了。 【参考方案1】:

你可以使用:

StringUtils.isAlphanumericSpace(string.replace('-', ' '));

【讨论】:

为了清楚起见,SkipHead 表示 StringUtils.isAlphanumericSpace(String),这比手动编写交互式检查代码要好得多。【参考方案2】:

嗯...只需使用 String.chatAt(int) 自己编程,这很容易...

使用位置索引遍历字符串中的所有char,然后使用ASCII字符0到9,a到z和A到Z使用连续代码的事实进行比较,所以你只需要检查字符 x 是否以数字方式验证条件之一:

在“0”和“9”之间 在“a”和“z”之间 在“A”和“Z”之间 一个空格'' 连字符“-”

这是一个基本的代码示例(使用 CharSequence,它可以让您传递一个字符串,也可以传递一个 StringBuilder 作为 arg):

public boolean isValidChar(CharSequence seq) 
    int len = seq.length();
    for(int i=0;i<len;i++) 
        char c = seq.charAt(i);
        // Test for all positive cases
        if('0'<=c && c<='9') continue;
        if('a'<=c && c<='z') continue;
        if('A'<=c && c<='Z') continue;
        if(c==' ') continue;
        if(c=='-') continue;
        // ... insert more positive character tests here
        // If we get here, we had an invalid char, fail right away
        return false;
    
    // All seen chars were valid, succeed
    return true;

【讨论】:

我会使用 java.lang.Character 测试,而不是基于 ASCII 字符集做出假设。 是的,Character.isLetterOrDigit() 可以做到这一点,但它会带来非常显着的性能成本(比简单的代码点比较慢 4 或 5 倍)。 它会拒绝许多其他有效的字母字符——在英语中使用得不多,所以它需要 1 μs 而不是 4μs。 (是的,它会拒绝“μs”:-))为了获得他没有要求的轻微性能提升而做出他没有说的假设并不是一个好主意。 考虑 SkipHead 的使用 StringUtils.isAlphanumericSpace 的建议,在我看来它更好。【参考方案3】:

只需遍历字符串,使用 java.lang.Character 中的字符类方法来测试每个字符是否可以接受。这大概就是 StringUtils 方法所做的一切,而正则表达式只是驱动通用引擎做同样事情的一种方式。

【讨论】:

【参考方案4】:

您有 2 个选项中的 1 个: 1. 编写一个可以在字符串中的字符列表,然后循环检查字符串以确保每个字符都在列表中。 2. 编写一个不能在字符串中的字符列表,然后循环检查字符串以确保每个字符都不在列表中。

选择任何更快的选项来组成列表。

【讨论】:

【参考方案5】:

一定要使用正则表达式。当有一个非常全面的系统来完成这项确切的任务时,编写自己的系统是没有意义的。如果您需要了解或复习正则表达式,请查看此网站,非常棒:http://regexr.com

我会在这方面挑战自己。

【讨论】:

以上是关于Java,确保字符串仅包含字母数字、空格和破折号的主要内容,如果未能解决你的问题,请参考以下文章

验证 UITextField 不包含字母

确保字符串仅包含字母数字字符的更好方法?

用破折号替换空格并使所有字母变为小写

如何编写正则表达式以仅匹配数字、字母和破折号?

使用 gsub 在字符串中仅保留字母数字字符和空格

LeetCode算法题-License Key Formatting(Java实现)