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

5
在Java中,我需要确保一个字符串只包含字母数字、空格和破折号。我找到了类org.apache.commons.lang.StringUtils和几乎足够的方法isAlphanumericSpace(String)...但我还需要包括破折号。有什么最好的方法可以做到这一点吗?我不想使用正则表达式。

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

13

你可以使用:

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

为了清晰起见,SkipHead 意味着 StringUtils.isAlphanumericSpace(String),这比手动编写迭代检查要好得多。 - Syntax

6

嗯…只需要使用String.charAt(int)自己编写程序,这很容易…

使用位置索引迭代字符串中的所有char,然后使用ASCII字符0到9、a到z和A到Z使用连续代码的事实进行比较,因此您只需要检查字符x数值上是否满足以下条件之一:

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

以下是一个基本的代码示例(使用CharSequence,它可以让您传递String但也可以传递StringBuilder作为参数):

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;
}

1
我会使用java.lang.Character测试,而不是基于ASCII字符集进行假设。 - kenj0418
是的,Character.isLetterOrDigit()可以做到这一点,但它会带来非常明显的性能成本(比简单的代码点比较慢4或5倍)。 - Varkhan
它会拒绝许多其他有效的字母字符 - 这些字符在英语中并不常用,只是为了使其需要1μs而不是4μs。 (是的,它会拒绝“μs” :-) )为了获得他没有要求的微小性能提升而做出未经允许的假设并不是一个好主意。 - kenj0418
考虑使用SkipHead的建议,使用StringUtils.isAlphanumericSpace,我个人认为这样更好。 - Syntax

3

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


1
你有两个选项: 1. 组成一个字符列表,该列表可以在字符串中出现,然后循环遍历字符串,检查每个字符是否在列表中。 2. 组成一个字符列表,该列表不能在字符串中出现,然后循环遍历字符串,检查每个字符是否不在列表中。
选择编写清单更快的选项。

0

一定要使用正则表达式。在这个确切的任务中,自己编写系统没有任何意义,因为已经有一个非常全面的系统。如果您需要学习或复习正则表达式,请查看这个网站,它非常好:http://regexr.com

我会挑战你自己做这件事。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接