Mengganti semua karakter non-alfanumerik dengan string kosong


197

Saya mencoba menggunakan ini tetapi tidak berhasil-

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

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.


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]|_", "");

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].


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.


21

Anda juga dapat mencoba regex sederhana ini:

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

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.


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

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


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)


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


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)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.