如何检查一个字符串是否只包含所选字符?

19

如何最好最简单地检查一个字符串是否只包含以下字符:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_

我想要一个类似这样的伪代码示例:

//If String contains other characters
else
//if string contains only those letters

拜托了,谢谢 :)


为什么每个人都建议使用正则表达式?那很慢啊! - thejh
@thejh:你的分析器(profiler)显示了什么? - Robert Harvey
3个回答

35
if (string.matches("^[a-zA-Z0-9_]+$")) {
  // contains only listed chars
} else {
  // contains other chars
}

与 \w 相比,这不是有点啰嗦吗?而且由于你正在匹配 ^ 和 $,所以它们是不必要的。此外,你的正则表达式似乎会匹配一个空字符串(使用 * 字符)。并不是说你的答案是错的,只是提供给问者的一些信息。 - Andrew White
除了一种情况:空字符串不包含列出的字符,因此在模式中应该使用“+”而不是“*”。 - gertas
安德鲁:我不确定\w(word)字符类是否仅与该字符集匹配。 - Pablo Lalloni
Andrew:需要使用 ^ & $ 确保字符串仅包含枚举字符。 - Pablo Lalloni
请查看以下链接,了解有关Java正则表达式的更多信息:http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html#matches%28java.lang.String,%20java.lang.CharSequence%29http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Matcher.html#matches%28%29 - gertas
1
你缺少一个闭括号。 - Bene Tleilax

6

对于这种特定的字符串类,请使用正则表达式"\w+"。

Pattern p = Pattern.compile("\\w+");
Matcher m = Pattern.matcher(str);

if(m.matches()) {} 
else {};

请注意,我使用Pattern对象编译正则表达式一次,以便它不必再次编译,如果您正在进行很多次或循环检查,则可能很好。根据Java文档...

如果要多次使用模式,则编译一次并重复使用比每次调用此方法更有效。


不错!只有一个小提示:如果需要经常运行,则应将 p 声明为静态常量。 - gertas
1
模式不会像那样工作。您需要类似以下的内容: Matcher m = p.matcher( s ); if ( m.matches()){} else{}; - digitaljoel
在我的非科学测试中,这明显是最快的,而且我使用了Pablo答案中的模式,而不是\w+。 - digitaljoel
抱歉,我修复了我的代码。虽然正则表达式 \w+ 与 [a-zA-Z0-9_]+ 相同,但这只是一个小问题。 - Andrew White

1

轮到我了:

static final Pattern bad = Pattern.compile("\\W|^$");
//...
if (bad.matcher(suspect).find()) {
  // String contains other characters
} else {
  // string contains only those letters
}

以上搜索单个不匹配或空字符串。

根据JavaDoc Pattern 的说明:

\w  A word character: [a-zA-Z_0-9]
\W  A non-word character: [^\w]

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