Java 用空字符串替换所有非字母数字字符
我试过用这个,但没用-Java 用空字符串替换所有非字母数字字符,java,regex,non-alphanumeric,Java,Regex,Non Alphanumeric,我试过用这个,但没用- return value.replaceAll("/[^A-Za-z0-9 ]/", ""); 使用[^A-Za-z0-9] 注意:删除了空格,因为它通常不被视为字母数字 return value.replaceAll("[^A-Za-z0-9 ]", ""); 这将保留完整的空间。我想这就是你想要的。否则,请从正则表达式中删除空格。请重试 return value.replaceAll("[^A-Za-z0-9]", ""); 或 Java的正则表达式不需要在正则
return value.replaceAll("/[^A-Za-z0-9 ]/", "");
使用
[^A-Za-z0-9]
注意:删除了空格,因为它通常不被视为字母数字
return value.replaceAll("[^A-Za-z0-9 ]", "");
这将保留完整的空间。我想这就是你想要的。否则,请从正则表达式中删除空格。请重试
return value.replaceAll("[^A-Za-z0-9]", "");
或
Java的正则表达式不需要在正则表达式周围放置正斜杠(
/
)或任何其他分隔符,例如,与Perl等其他语言不同 我使用此方法创建文件名:
public static String safeChar(String input)
{
char[] allowed = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_".toCharArray();
char[] charArray = input.toString().toCharArray();
StringBuilder result = new StringBuilder();
for (char c : charArray)
{
for (char a : allowed)
{
if(c==a) result.append(a);
}
}
return result.toString();
}
您也可以尝试以下更简单的正则表达式:
str = str.replaceAll("\\P{Alnum}", "");
您应该知道,
[^a-zA-Z]
将替换不在字符范围a-Z/a-Z中的字符。这意味着像é
、ß
等特殊字符或西里尔字母等将被删除
如果不需要替换这些字符,请使用预定义的字符类:
str.replaceAll("[^\\p{IsAlphabetic}\\p{IsDigit}]", "");
PS:\p{Alnum}
无法达到此效果,其作用与[A-Za-z0-9]
简单方法相同:
public boolean isBlank(String value) {
return (value == null || value.equals("") || value.equals("null") || value.trim().equals(""));
}
public String normalizeOnlyLettersNumbers(String str) {
if (!isBlank(str)) {
return str.replaceAll("[^\\p{L}\\p{Nd}]+", "");
} else {
return "";
}
}
输出:衣原体ppiggigmigaabs8006
GITHUB:< P>如果您还希望允许不属于ASCII字符集的字母数字字符,例如德语UMLUUT,可以考虑使用以下解决方案:
String value = "your value";
// this could be placed as a static final constant, so the compiling is only done once
Pattern pattern = Pattern.compile("[^\\w]", Pattern.UNICODE_CHARACTER_CLASS);
value = pattern.matcher(value).replaceAll("");
output = CharMatcher.javaLetterOrDigit().retainFrom(input);
请注意,使用UNICODE_CHARACTER_CLASS标志可能会对性能造成影响(请参阅此标志的javadoc)使用Guava,您可以轻松地组合不同类型的标准。对于您的特定解决方案,您可以使用:
value = CharMatcher.inRange('0', '9')
.or(CharMatcher.inRange('a', 'z')
.or(CharMatcher.inRange('A', 'Z'))).retainFrom(value)
解决方案:
value.replaceAll([^A-Za-z0-9],”)
说明:
[^abc]
当插入符号^
显示为方括号内的第一个字符时,它将否定模式。此模式匹配除a、b或c之外的任何字符
将关键字视为两个函数:
[(模式)]=匹配(模式)
[^(模式)]=不匹配(模式)
A-Z=从A到Z包含的所有字符
a-z=从a到z包含的所有字符
0=9=从0到9的所有字符
String value = "your value";
// this could be placed as a static final constant, so the compiling is only done once
Pattern pattern = Pattern.compile("[^\\w]", Pattern.UNICODE_CHARACTER_CLASS);
value = pattern.matcher(value).replaceAll("");
output = CharMatcher.javaLetterOrDigit().retainFrom(input);
字符类末尾的空格也不应为空。reg exp正常,只需从值的regexp字符串中删除“/”。replaceAll(“/[^A-Za-z0-9]/”,”);对.replaceAll进行赋值(“[^A-Za-z0-9]”,“”);您不需要在regexp中使用“/”,我认为您混淆了javascript模式,因为它只适用于拉丁字母,不适用于重音字符或任何“特殊”字符集。带下划线,
return value.replaceAll(\\W“,”)代码>当然。编译器非常擅长发现这类东西。第二个编译器无法回答这个问题。像:/\etc这样的角色呢?这是一种蛮力。正则表达式是符合OP情况的方法。你是对的,正则表达式更好。但当时,我和regex相处得不好。哈,有人真的和regex相处得那么好吗?;)伙计们,你们忘了除了拉丁字母以外还有其他字母。但是,如果你们想验证主机名,这将有助于排除无效的字母。非常感谢这篇文章——它对我非常有用。此外,我相信这就是问题的实际答案。拉丁字母表不是世界上唯一的!实际上,声明的正则表达式将“^”视为有效字符,因为只有第一次出现的“^”否定了选择的含义<代码>[^\\p{IsAlphabetic}\\p{IsDigit}]
运行良好。@JakubTurcovsky将IsAlphabetic和IsDigit定义为二进制属性。Alpha和Digit是POSIX字符类(仅限US-ASCII)。除了指定了标志之外。@AndreSteingress Correct,原因是{IsDigit}
对我不起作用,而{Digit}
对我起作用是因为我正在Android上尝试这个。Android默认启用了UNICODE\u CHARACTER\u CLASS
。感谢您的许可。如何只允许字母、数字和表情符号?或者,保留空白:str.replaceAll([^\\p{Alnum}\\s],”)
或\\p{Alnum}\\p{Space}
。