我可以检查字符串以包含我没有列出的字符吗?

时间:2014-06-10 22:34:19

标签: java string

要检查字符串是否包含特定字符,您可以使用indexOf方法。

"Blah blah.".indexOf(".");  //Returns number

我有一个字符串,除了字母和数字之外不应该包含任何内容。我可以通过正则表达式检查:

[^a-zA-Z0-9]
or just
[a-z\d]  /i

但在这种特殊情况下,不欢迎正则表达式。在像C(或C ++)这样的语言中,我会循环使用字符串。据我所知,在Java中[]运算符不是字符串的选项。

是否有比regexp更快的选项?

4 个答案:

答案 0 :(得分:3)

您可以使用String.indexOf:

boolean isLetterOrDigit(String s) {
    final String UPPERCASE_LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    final String LOWERCASE_LETTERS = "abcdefghijklmnopqrstuvwxyz";
    final String NUMBERS = "1234567890";
    final String ALLOWED = UPPERCASE_LETTERS 
    + LOWERCASE_LETTERS + NUMBERS;
    for (char ch : s.toCharArray()) {
        if (ALLOWED.indexOf(ch) == -1) {
            return false;
        }
    } 
    return true;
}

答案 1 :(得分:1)

如果您在紧密的内循环中进行大量验证并且性能是一个问题,一个常见的模式是保留预编译的正则表达式,例如:作为一个静态常量,以避免为每次验证重新编译相同的正则表达式的开销(如String提供的便捷方法中所做的那样):

import java.util.regex.Pattern;

public class StringValidate {
  private static final Pattern VALID_STR = Pattern.compile("(?i)[a-z0-9]+");

  public static boolean isValidStr(String s) {
    return VALID_STR.matcher(s).matches();
  }

  public static void main(String[] args) {
    System.out.println(isValidStr("abc12d")); // true
    System.out.println(isValidStr("xyz "));   // false
  }
}

这里的优势在于,只需修改正则表达式,您就可以轻松调整验证规则,只需最少的代码更改。

答案 2 :(得分:0)

可以通过matches()方法使用正则表达式进行测试:

if (!str.matches("[a-zA-Z0-9]+")) {
    // str contains an unwanted char

在java中的FYI,正则表达式标志在正则表达式本身中编码,因此要实现不区分大小写的示例:

 if (!str.matches("(?i)[a-z0-9]+"))

另请注意,\d不等同于[0-9],因为它包含所有数字字符(例如阿拉伯语,中文等)。

答案 3 :(得分:0)

如果我理解正确的话。有一个名为String.contains(CharSequence s)的方法可以找到字符串中的任何子序列。希望能帮助到你。