【问题标题】:Java Prevent Special Characters [duplicate]Java防止特殊字符[重复]
【发布时间】:2015-06-25 01:43:17
【问题描述】:

我想删除这些特殊字符:☺ ☼

我只想要字符 A-Z、0-9 以及可以使用 shift 键和数字键入的符号,例如 !和@。

这是我现在拥有的代码,它仅在字符串包含来自其他语言的字符时才返回 true。

public static boolean hasSymbols(String v) {
    boolean b = false;
    byte bytearray []  = v.getBytes(); 
    CharsetDecoder d = Charset.forName("US-ASCII").newDecoder();
    try {
        CharBuffer r = d.decode(ByteBuffer.wrap(bytearray));  
        r.toString();  
    } catch (Exception e) {
        return true;
    }
    return b;
}

【问题讨论】:

  • 您是在询问删除字符的代码,还是询问您的函数是否是检测它们的好方法?
  • @galdre nope,该问题要求删除所有“非字母数字字符”,而此处 OP 要求删除“特殊字符”(如果通过代码判断,则为非 ascii)。
  • 是的,但是非常接近——这两个问题之间没有本质上的不同,只是表面上。
  • @galdre 不正确:不应删除像 ?!/,. 这样的字符,尽管它们不是字母数字
  • 也许你可以使用一些简单的正则表达式匹配?

标签: java character


【解决方案1】:

有几种方法可以做到这一点,具体取决于您想要做什么。

如果(如问题所述)您想要删除所有不是“AZ、0-9 和可以使用 shift 键和数字键入的符号,例如 ! 和 @”的字符,最好的方法就是构造一个匹配你不想删除的字符的正则表达式模式,并使用String.matches(String)String.replaceAll(String, String)方法:

private static final String NON_NORMAL_CHARACTERS_PATTERN = "\\W|[^!@#\\$%\\^&\\*\\(\\)]";

public static boolean hasSymbols(String string) {
    return string.matches(NON_NORMAL_CHARACTERS_PATTERN);
}

public static String removeSymbols(String string) {
    return string.replaceAll(NON_NORMAL_CHARACTERS_PATTERN, "");
}

上面称为NON_NORMAL_CHARACTERS_PATTERN 的模式将非单词字符与\W 匹配,除Shift+[0-9] 之外的所有字符与[^!@#\$%\^&\*\(\)] 匹配。

如果您想要删除所有不在 127 字符 ASCII 集中的字符,您可以利用以下事实:对于这些字符,Character.getNumericValue(char) 将始终小于或等于 127:

public static boolean isNonASCII(char character) {
    return Character.getNumericValue(character) > 127;
}

public static boolean hasNonASCII(String string) {
    for (char currentChar : string.toCharArray()) {
        if (isNonASCII(currentChar)) {
            return false;
        }
    }

    return true;
}

public static String removeNonASCII(String string) {
    StringBuilder stringBuilder = new StringBuilder();

    for (char currentChar : string.toCharArray()) {
        if (!isNonASCII(currentChar)) {
            stringBuilder.append(currentChar);
        }
    }

    return stringBuilder.toString();
}

【讨论】:

  • 这些都不起作用。对于您提供的第一个方法,如果字符串中只有一个字符,它对任何字符都返回 true。在第二种方法中,它的效果要好一些,但是除了字母或数字之外的任何东西都会返回 -1。它给出的数字也与网上找到的任何 ASCII 表都不匹配。对于 1,它返回 1,等等。
猜你喜欢
  • 1970-01-01
  • 2019-06-21
  • 2017-12-10
  • 2017-11-22
  • 1970-01-01
  • 2017-05-02
  • 2023-03-06
  • 2014-03-15
  • 1970-01-01
相关资源
最近更新 更多