Bagaimana cara menghapus karakter khusus dari string?

90

Saya ingin menghapus karakter khusus seperti:

- + ^ . : ,

dari String menggunakan Java.

Sameek Mishra
sumber
Anda rupanya sudah tahu apa itu regex berdasarkan bagaimana Anda menandai pertanyaan Anda. Apakah Anda mencoba membaca dokumentasi untuk Stringkelas tersebut? Secara khusus, cari kata 'regex'; ada beberapa metode, dan sedikit pemikiran akan memberitahu Anda bagaimana untuk melanjutkan ... :)
Karl Knechtel
3
Frase "karakter khusus" terlalu sering digunakan hingga hampir tidak ada artinya sama sekali. Jika yang Anda maksud adalah, "Saya memiliki daftar karakter tertentu yang ingin saya hapus," maka lakukan seperti yang disarankan Thomas dan bentuk pola Anda dengan kelas karakter regex dan replaceAlltinggalkan. Jika Anda memiliki persyaratan esoterik lainnya, edit pertanyaannya. :)
Ray Toal
1
itu bukan karakter khusus ... ini adalah: äâêíìéè karena mereka bukan tipe karakter 1-byte yang umum seperti - + ^ adalah ... bagaimanapun, seperti yang dikatakan Ray, lakukan a replaceAlluntuk mereka, atau, lakukan penguraian string, tambahkan karakter yang bukan karakter yang ingin Anda keluarkan ke string lain dan pada akhirnya cukup lakukan + = ke String yang akan Anda kembalikan.
Gonçalo Vieira
deleteChars.apply( fromString, "-+^.:," );- temukan deleteChars di sini
Kaplan

Jawaban:

255

Itu tergantung pada apa yang Anda definisikan sebagai karakter khusus, tetapi cobalah replaceAll(...):

String result = yourString.replaceAll("[-+.^:,]","");

Perhatikan bahwa ^karakter tersebut tidak boleh menjadi yang pertama dalam daftar, karena Anda harus menghindarinya atau itu berarti "apa saja kecuali karakter ini".

Catatan lain: -karakter harus menjadi yang pertama atau terakhir pada daftar, jika tidak, Anda harus menghindarinya atau akan menentukan rentang (misalnya, :-,berarti "semua karakter dalam rentang :ke ,).

Jadi, untuk menjaga konsistensi dan tidak tergantung pada posisi karakter, Anda mungkin ingin melarikan diri semua karakter yang memiliki arti khusus dalam ekspresi reguler (daftar berikut tidak lengkap, jadi menyadari karakter lain seperti (, {, $ dll) :

String result = yourString.replaceAll("[\\-\\+\\.\\^:,]","");


Jika Anda ingin menghilangkan semua tanda baca dan simbol, coba regex ini: \p{P}\p{S}(perlu diingat bahwa dalam string Java Anda harus melepaskan garis miring belakang :) "\\p{P}\\p{S}".

Cara ketiga bisa jadi seperti ini, jika Anda dapat menentukan dengan tepat apa yang harus tersisa di string Anda:

String  result = yourString.replaceAll("[^\\w\\s]","");

Artinya: ganti semua yang bukan karakter kata (az dalam hal apa pun, 0-9 atau _) atau spasi.

Sunting: harap dicatat bahwa ada beberapa pola lain yang mungkin terbukti membantu. Namun, saya tidak bisa menjelaskan semuanya, jadi lihatlah bagian referensi regular-expressions.info .

Berikut alternatif yang tidak terlalu ketat untuk pendekatan "tentukan karakter yang diizinkan", seperti yang disarankan oleh Ray:

String  result = yourString.replaceAll("[^\\p{L}\\p{Z}]","");

Regex cocok dengan semua yang bukan huruf dalam bahasa apa pun dan bukan pemisah (spasi, pemisah baris, dll.). Perhatikan bahwa Anda tidak dapat menggunakan [\P{L}\P{Z}](huruf besar P berarti tidak memiliki properti itu), karena itu berarti "segala sesuatu yang bukan huruf atau bukan spasi", yang hampir cocok dengan semuanya, karena huruf bukan spasi dan sebaliknya.

Informasi tambahan tentang Unicode

Beberapa karakter unicode tampaknya menyebabkan masalah karena berbagai kemungkinan cara untuk menyandikannya (sebagai titik kode tunggal atau kombinasi titik kode). Silakan merujuk ke regular-expressions.info untuk informasi lebih lanjut.

Thomas
sumber
1 untuk solusi tujuan umum terbaik. Karena Anda mencantumkan beberapa variasi tanpa detail dari OP, Anda mungkin juga menunjukkan dan menjelaskan pola seperti[\P{L}]
Ray Toal
Perhatikan juga bahwa -karakter harus menjadi yang pertama atau terakhir dalam daftar atau harus di-escape.
kapex
[^\\p{L}\\p{Z}]tampaknya menghilangkan Umlaut Jerman (ä, ö, ü) juga (setidaknya itu melakukannya untuk saya: /), jadi "Regex cocok dengan semua yang bukan huruf dalam bahasa apa pun" tampaknya tidak 100% benar
Peter
@Peter itu tidak menghilangkan karakter tersebut dalam pengujian saya. Mungkin ada masalah lain dalam kasus Anda, misalnya pengkodean teks yang berbeda. Saya akan menambahkan tautan ke informasi lebih lanjut.
Thomas
1
@ Thomas String result = yourString.replaceAll("[^\w\s]","");membuat kesalahanInvalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
Visruth
40

Ini akan mengganti semua karakter kecuali alfanumerik

replaceAll("[^A-Za-z0-9]","");
Stephen
sumber
Ini juga akan menghapus karakter arab.
S0haib Nasir
1
Ini adalah jawaban terbaik.
Marius Razvan Varvarei
18

Seperti dijelaskan di sini http://developer.android.com/reference/java/util/regex/Pattern.html

Pola adalah ekspresi reguler yang dikompilasi. Dalam banyak kasus, metode praktis seperti String.matches, String.replaceAlldan String.splitakan lebih disukai, tetapi jika Anda perlu melakukan banyak pekerjaan dengan ekspresi reguler yang sama, mungkin lebih efisien untuk mengkompilasinya sekali dan menggunakannya kembali. Kelas Pola dan pendampingnya, Matcher, juga menawarkan lebih banyak fungsionalitas daripada sejumlah kecil yang diekspos oleh String.

public class RegularExpressionTest {

public static void main(String[] args) {
    System.out.println("String is = "+getOnlyStrings("!&(*^*(^(+one(&(^()(*)(*&^%$#@!#$%^&*()("));
    System.out.println("Number is = "+getOnlyDigits("&(*^*(^(+91-&*9hi-639-0097(&(^("));
}

 public static String getOnlyDigits(String s) {
    Pattern pattern = Pattern.compile("[^0-9]");
    Matcher matcher = pattern.matcher(s);
    String number = matcher.replaceAll("");
    return number;
 }
 public static String getOnlyStrings(String s) {
    Pattern pattern = Pattern.compile("[^a-z A-Z]");
    Matcher matcher = pattern.matcher(s);
    String number = matcher.replaceAll("");
    return number;
 }
}

Hasil

String is = one
Number is = 9196390097
turbandroid
sumber
Ini akan menghapus karakter arab
S0haib Nasir
15

Coba replaceAll()metode Stringkelas.

BTW di sini adalah metode, tipe pengembalian dan parameter.

public String replaceAll(String regex,
                         String replacement)

Contoh:

String str = "Hello +-^ my + - friends ^ ^^-- ^^^ +!";
str = str.replaceAll("[-+^]*", "");

Ini harus menghapus semua karakter {'^', '+', '-'} yang ingin Anda hapus!

omt66
sumber
6

Untuk Menghapus Karakter Khusus

String t2 = "!@#$%^&*()-';,./?><+abdd";

t2 = t2.replaceAll("\\W+","");

Outputnya adalah: abdd.

Ini bekerja dengan sempurna.

Akila
sumber
1
akan mendapatkan karakter escape ilegal dalam string literal
John Joe
Ini juga akan menghapus spasi jika Anda ingin tetap menggunakan t2 = t2.replaceAll ("[^ \\ w \\ s]", "");
Isuru Dilshan
2

Gunakan String.replaceAll()metode di Java. replaceAll harus cukup baik untuk masalah Anda.

MT.
sumber
1

Anda dapat menghapus karakter tunggal sebagai berikut:

String str="+919595354336";

 String result = str.replaceAll("\\\\+","");

 System.out.println(result);

KELUARAN:

919595354336
Satya
sumber
0

Jika Anda hanya ingin melakukan penggantian literal di java, gunakan Pattern.quote(string)untuk meng-escape string apa pun ke literal.

myString.replaceAll(Pattern.quote(matchingStr), replacementStr)
Tezra
sumber