Mengganti semua karakter non-alfanumerik dengan string kosong

197

Saya mencoba menggunakan ini tetapi tidak berhasil-

return value.replaceAll("/[^A-Za-z0-9 ]/", "");
Alex Gomes
sumber
36
Guys, Anda lupa ada huruf selain yang Latin.
Mateva
2
Tetapi jika Anda ingin memvalidasi nama host misalnya, ini akan baik untuk mengecualikan huruf yang tidak valid.
Gurnard

Jawaban:

245

Gunakan [^A-Za-z0-9].

Catatan: menghapus spasi karena itu biasanya tidak dianggap alfanumerik.

Mirek Pluta
sumber
10
Begitu pula ruang pada akhir kelas karakter.
Andrew Duffy
6
Dia mungkin terbiasa pemrograman dalam PHP.
William
10
@ William - sangat disayangkan bahwa PHP sekarang mendapatkan kredit untuk PCRE
Thomas Dignan
reg exp ok, cukup hapus "/" dari string regexp dari value.replaceAll ("/ [^ A-Za-z0-9] /", ""); untuk value.replaceAll ("[^ A-Za-z0-9]", ""); Anda tidak memerlukan "/" di dalam regexp, saya pikir Anda telah bingung dengan pola javascript
eriknyk
128

Mencoba

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

atau

return value.replaceAll("[\\W]|_", "");
Andrew Duffy
sumber
4
Dengan garis bawah,return value.replaceAll("\\W", "");
erickson
Tentu saja. Compiler sangat ahli dalam hal-hal semacam itu.
Andrew Duffy
1
Yang kedua tidak menjawab pertanyaan. Bagaimana dengan karakter seperti: / \ etc?
WW.
67

Anda harus sadar bahwa [^a-zA-Z]akan mengganti karakter yang tidak berada dalam rentang karakter AZ / az. Itu berarti karakter khusus seperti é, ßdll. Atau karakter cyrillic dan semacamnya akan dihapus.

Jika penggantian karakter ini tidak diinginkan, gunakan kelas karakter yang sudah ditentukan sebelumnya:

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

PS: \p{Alnum}tidak mencapai efek ini, ia bertindak sama seperti [A-Za-z0-9].

Andre Steingress
sumber
11
Terima kasih banyak untuk posting ini - itu sangat berguna bagi saya. Selain itu, saya percaya ini adalah jawaban aktual untuk pertanyaan itu. Alfabet Latin bukan satu-satunya di dunia!
Mateva
2
Sebenarnya, regex yang dinyatakan akan memperlakukan "^" sebagai karakter yang valid, karena hanya kemunculan pertama dari "^" yang meniadakan arti seleksi. [^\\p{IsAlphabetic}\\p{IsDigit}]bekerja dengan baik.
Bogdan Klichuk
1
@JakubTurcovsky docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.html mendefinisikan IsAlphabetic dan IsDigit sebagai properti biner. Alpha dan Digit adalah kelas karakter POSIX (hanya AS-ASCII). Kecuali flag docs.oracle.com/javase/10/docs/api/java/util/regex/… ditentukan.
Andre Steingress
@AndreSteingress Benar, alasannya {IsDigit}tidak bekerja untuk saya dan {Digit}tidak adalah karena saya mencoba ini di Android. Dan Android telah UNICODE_CHARACTER_CLASSdihidupkan secara default. Terima kasih atas izinnya.
Jakub Turcovsky
Bagaimana cara hanya mengizinkan Alpha, Digit, dan Emoji?
Robert Goodrick
50
return value.replaceAll("[^A-Za-z0-9 ]", "");

Ini akan membuat ruang tetap utuh. Saya berasumsi itu yang Anda inginkan. Jika tidak, hapus spasi dari regex.

erickson
sumber
21

Anda juga dapat mencoba regex sederhana ini:

 str = str.replaceAll("\\P{Alnum}", "");
Saurav
sumber
2
Atau, melestarikan ruang putih:str.replaceAll("[^\\p{Alnum}\\s]", "")
Jonik
Atau \\p{Alnum}\\p{Space}.
membersound
10

Ekspresi reguler Java tidak mengharuskan Anda untuk membuat garis miring ( /) atau pembatas lainnya di sekitar regex, sebagai lawan dari bahasa lain seperti Perl, misalnya.

abyx
sumber
8

Saya membuat metode ini untuk membuat nama file:

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();
}
zneo
sumber
5
Ini kekuatan yang sangat kasar. Regex adalah cara untuk mengikuti situasi OP.
Michael Peterson
1
Anda benar, regex lebih baik. Tetapi pada saat itu, regex dan saya, saya tidak datang dengan baik.
zneo
Hah, apakah ada yang benar-benar cocok dengan regex? ;)
Michael Peterson
6

Larutan:

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

Penjelasan:

[^abc] Ketika tanda ^muncul sebagai karakter pertama di dalam tanda kurung siku, itu meniadakan pola. Pola ini cocok dengan karakter apa pun kecuali a atau b atau c.

Melihat kata kunci sebagai dua fungsi:

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

Terlebih lagi mengenai suatu pola:

  • 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

Oleh karena itu akan mengganti semua char TIDAK termasuk dalam pola

GalloCedrone
sumber
3

Jika Anda juga ingin membolehkan karakter alfanumerik yang bukan milik set karakter ascii, seperti misalnya jerman umlaut, Anda dapat mempertimbangkan untuk menggunakan solusi berikut:

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

Harap perhatikan bahwa penggunaan flag UNICODE_CHARACTER_CLASS dapat berdampak pada penalti kinerja (lihat javadoc dari flag ini)

jepret
sumber
1

Metode sederhana:

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 "";
    }
}
Alberto Cerqueira
sumber
1

Menggunakan Guava Anda dapat dengan mudah menggabungkan berbagai jenis kriteria. Untuk solusi spesifik Anda, Anda dapat menggunakan:

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

CharMatcher Guava memberikan solusi ringkas:

output = CharMatcher.javaLetterOrDigit().retainFrom(input);
Bunarro
sumber