用空字符串替换所有非字母数字字符


197

我尝试使用此工具,但没有成功-

return value.replaceAll("/[^A-Za-z0-9 ]/", "");

36
伙计们,您会忘记拉丁字母以外的其他字母。
Mateva

2
但是,例如,如果您要验证主机名,则最好排除无效的字母。
古纳德

Answers:


245

使用[^A-Za-z0-9]

注意:删除了空格,因为通常不将其视为字母数字。


10
字符类末尾的空格也不应该。
Andrew Duffy

6
他可能已经习惯于用PHP编程。
威廉

10
@William-不幸的是PHP现在为PCRE
赢得了声誉

reg exp没问题,只需从value.replaceAll(“ / [^ A-Za-z0-9] /”,“”)的regexp字符串中删除“ /”即可;到value.replaceAll(“ [^ A-Za-z0-9]”,“”); 您不需要在正则表达式中使用“ /”,我认为您已将JavaScript模式混淆了
eriknyk

128

尝试

return value.replaceAll("[^A-Za-z0-9]", "");

要么

return value.replaceAll("[\\W]|_", "");

4
带下划线,return value.replaceAll("\\W", "");
erickson

当然。编译器非常擅长发现这种情况。
Andrew Duffy

1
第二个没有回答这个问题。像:/ \等字符呢?
WW。

67

您应该意识到,[^a-zA-Z]它将替换字符范围AZ / az中本身不存在的字符。这意味着特殊字符,如éß等,或西里尔字符和诸如将被删除。

如果不想替换这些字符,请使用预定义的字符类:

 str.replaceAll("[^\\p{IsAlphabetic}\\p{IsDigit}]", "");

PS:\p{Alnum}无法达到此效果,其作用与相同[A-Za-z0-9]


11
非常感谢这篇文章-这对我非常有用。另外,我相信这是对该问题的实际答案。拉丁字母不是世界上唯一的一个!
Mateva

2
实际上,规定的正则表达式会将“ ^”视为有效字符,因为只有“ ^”的首次出现会否定选择的含义。[^\\p{IsAlphabetic}\\p{IsDigit}]效果很好。
Bogdan Klichuk '18年

1
@JakubTurcovsky docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.html将IsAlphabetic和IsDigit定义为二进制属性。Alpha和Digit是POSIX字符类(仅适用于US-ASCII)。除了指定了docs.oracle.com/javase/10/docs/api/java/util/regex/…标志外。
安德烈·史汀辛格

@AndreSteingress正确,原因{IsDigit}对我{Digit}不起作用,原因是我正在Android上尝试此操作。并且Android UNICODE_CHARACTER_CLASS默认情况下处于打开状态。感谢您的通关。
雅各布·特罗科夫斯基

如何只允许Alpha,Digit和Emoji?
罗伯特·古德里克

50
return value.replaceAll("[^A-Za-z0-9 ]", "");

这将保留完整的空间。我想那就是你想要的。否则,请从正则表达式中删除空格。


21

您也可以尝试使用以下更简单的正则表达式:

 str = str.replaceAll("\\P{Alnum}", "");

2
或者,保留空白:str.replaceAll("[^\\p{Alnum}\\s]", "")
Jonik 2015年

或者\\p{Alnum}\\p{Space}
membersound

10

/与其他语言(例如Perl)相反,Java的正则表达式不需要您在正则表达式周围加上正斜杠()或任何其他定界符。


8

我使用此方法来创建文件名:

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();
}

5
这是蛮力的。正则表达式是解决OP情况的方法。
Michael Peterson

1
您是对的,正则表达式更好。但是当时,正则表达式和我的关系不太好。
zneo 2012年

嗯,真的有人与regex相处得很好吗?;)
Michael Peterson

6

解:

value.replaceAll("[^A-Za-z0-9]", "")

说明:

[^abc] 当插入符号^作为方括号内的第一个字符出现时,它会否定该模式。该模式匹配除a或b或c之外的任何字符。

将关键字视为两个功能:

  • [(Pattern)] = match(Pattern)
  • [^(Pattern)] = notMatch(Pattern)

此外,关于模式:

  • A-Z = all characters included from A to Z

  • a-z = all characters included from a to z

  • 0=9 = all characters included from 0 to 9

因此它将替换模式中不包括的所有字符


3

如果您还希望允许不属于ascii字符集的字母数字字符(例如德语变音符号),可以考虑使用以下解决方案:

 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("");

请注意,使用UNICODE_CHARACTER_CLASS标志可能会影响性能(请参见此标志的javadoc)


1

简单方法:

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 "";
    }
}


1

使用番石榴,您可以轻松地组合不同类型的条件。对于您的特定解决方案,您可以使用:

value = CharMatcher.inRange('0', '9')
        .or(CharMatcher.inRange('a', 'z')
        .or(CharMatcher.inRange('A', 'Z'))).retainFrom(value)

1

Guava的CharMatcher提供了一个简洁的解决方案:

output = CharMatcher.javaLetterOrDigit().retainFrom(input);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.