10 回答
这应该有效,“如果您希望在字符串中仅保留 ASCII (0-127) 字符”:
String str = "This is sample CCNA program. it contains CCNP™";
str = str.replaceAll("[^\\x00-\\x7f]+", "");
你想从你的字符串中删除所有特殊字符吗?如果是这样:
String alphaOnly = input.replaceAll("[^a-zA-Z]+","");
String alphaAndDigits = input.replaceAll("[^a-zA-Z0-9]+","");
请参阅Sean Patrick Floyd对可能重复问题的回答。
你可以从 Unicode 的角度来做:
String s = "This is sample CCNA program. it contains CCNP™. And it contains digits 123456789.";
String res = s.replaceAll("[^\\p{L}\\p{M}\\p{P}\\p{Nd}\\s]+", "");
System.out.println(res);
将打印出:
这是示例 CCNA 程序。它包含CCNP。它包含数字 123456789。
\\p{...}
是一个Unicode 属性
\\p{L}
匹配所有语言的所有字母
\\p{M}
旨在与另一个字符组合的字符(例如重音符号、变音符号、封闭框等)。
\\p{P}
任何一种标点符号。
\\p{Nd}
除表意文字外,任何文字中的数字 0 到 9。
因此,此正则表达式将替换不是字母(也包括组合字母)、标点符号、数字或空格字符 ( \\s
) 的每个字符。
^[\\u0000-\\u007F]*$
有了这个,你只允许 ASCCI 字符,但你需要告诉我们什么是你的特殊字符。
String yourString = "This is sample CCNA program. it contains CCNP™";
String result = yourString.replaceAll("[\\™]","");
System.out.println(yourString);
System.out.println(result);
上面关于删除字符 > 128 的答案非常有帮助。谢谢你。
但是,它没有涵盖某些情况,例如连续 2 个坏字符或字符串末尾的坏字符。这是我的修改,删除了除制表符和换行符之外的所有特殊字符。
// Remove all special characters except tab and linefeed
public static String cleanTextBoxData(String value) {
if (value != null) {
int beforeLen = value.length();
for (int i = 0; i < value.length(); i++) {
if ( ((value.charAt(i)<32) || (value.charAt(i)>126)) &&
((value.charAt(i)!=9) && (value.charAt(i)!=10)) ) {
if ((value.charAt(i)<32) || (value.charAt(i)>126)) {
if (i==value.length()-1) {
value = value.substring(0,i);
} else {
value = value.substring(0,i) + value.substring(i+1);
i--;
}
}
if (i == value.length()) {
break;
}
}
}
int dif = beforeLen - value.length();
if (dif > 0) {
logger.warn("Found and removed {} bad characters from text box.", dif);
}
}
return value;
}
正则表达式的替代选项以排除 > 128 的字符。
String s = "This is sample CCNA program. it contains CCNP™";
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) > 128) {
s = s.substring(0, i)
+ s.substring(i + 1);
i++;
}
}
import java.util.Scanner;
public class replacespecialchar {
/**
* @param args
*/
public static void main(String[] args) {
String before="";
String after="";
Scanner in =new Scanner(System.in);
System.out.println("enter string with special char");
before=in.nextLine();
for (int i=0;i<before.length();i++)
{
if (before.charAt(i)>=65&&before.charAt(i)<=90 || before.charAt(i)>=97&&before.charAt(i)<=122)
{
after+=before.charAt(i);
}
}
System.out.println("String with special char "+before);
System.out.println("String without special char "+after);
}
}
您也可以尝试以下方法:
Normalizer.decompose(str, false, 0).replaceAll("\\p{InSuperscriptsAndSubscripts}+", "");
但您需要找到正确的 Unicode 组或组(Unicode 块)。
您必须真正定义实例中的特殊字符。
如果你不是 RegEx 的粉丝,你可以考虑使用一些Character
课外的方法。请参阅下面的示例:
public class Test {
public static void main(String[] args) {
String test = "This is sample CCNA program. it contains CCNP™";
System.out.println("Character\tAlpha or Letter\tWhitespace");
for (char c : test.toCharArray()) {
System.out.println(
c + "\t\t"
+ Character.isLetterOrDigit(c) + "\t\t"
+ Character.isWhitespace(c));
}
}
}
除了上述方法之外,您还可以使用其他方法。查看Character
类 API。