Bir dizeden özel karakterler nasıl kaldırılır?


92

Şunun gibi özel karakterleri kaldırmak istiyorum:

- + ^ . : ,

Java kullanan bir dizeden.


Görünüşe göre, sorunuzu nasıl etiketlediğinize bağlı olarak bir normal ifadenin ne olduğunu zaten biliyorsunuz. StringSınıfın belgelerini okumayı denediniz mi? Özellikle, 'regex' kelimesini arayın; birkaç yöntem var ve biraz düşünce size nasıl devam edeceğinizi anlatmalı ... :)
Karl Knechtel

3
"Özel karakter" ifadesi o kadar fazla kullanılır ki neredeyse tamamen anlamsızdır. Demek istediğin, "Kaldırmak istediğim bu belirli karakterlerin listesine sahibim" ise, o zaman Thomas'ın önerdiği gibi yapın ve bir normal ifade karakter sınıfı ve replaceAllonlardan uzakta kalıpınızı oluşturun . Daha ezoterik gereksinimleriniz varsa soruyu düzenleyin. :)
Ray Toal

1
bunlar özel karakterler değiller ... bunlar: äâêíìéè çünkü - + ^ gibi ortak 1 baytlık karakter türleri değiller ... her neyse, Ray'in de belirttiği gibi, ya replaceAllonlar için bir yapın ya da bir ayrıştırma yapın dize, çıkarmak istediğiniz karakter olmayan karakterleri başka bir dizeye ekleyin ve sonunda geri döneceğiniz String'e sadece + = yapın.
Gonçalo Vieira

deleteChars.apply( fromString, "-+^.:," );- deleteChars'ı burada bulabilirsiniz
Kaplan

Yanıtlar:


258

Bu, neyi özel karakterler olarak tanımladığınıza bağlıdır, ancak şunu deneyin replaceAll(...):

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

Not olduğunu ^o zaman ya bunu kaçmak zorunda kalacak ya da "herhangi fakat bu karakterleri" anlamına geleceğini çünkü karakter, listedeki ilk olmamalıdır.

Başka not: -karakter aksi takdirde ondan kaçmak olurdu ya da bir dizi tanımlarsınız (örneğin listedeki ilk veya son biri olması gerekir :-,aralığındaki "tüm karakterleri anlamına gelecektir :için ,).

Karakter konumlandırma bağlıdır tutarlılık tutmak için değil yani, sen normal ifadelerde özel anlam tüm bu karakterlerden kurtulmak isteyebilirsiniz (Aşağıdaki liste, böylece diğer karakterlerin farkında tamamlanmadı olacak gibi (, {, $ vs.) :

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


Tüm noktalama işaretlerinden ve sembollerden kurtulmak istiyorsanız, şu normal ifadeyi deneyin: \p{P}\p{S}(Java dizgilerinde ters eğik çizgilerden kaçınmanız gerektiğini unutmayın :) "\\p{P}\\p{S}".

Üçüncü bir yol, dizenizde ne bırakılması gerektiğini tam olarak tanımlayabilirseniz, bunun gibi bir şey olabilir:

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

Bu şu anlama gelir: kelime karakteri (her durumda az, 0-9 veya _) veya boşluk olmayan her şeyi değiştirin.

Düzenleme: Lütfen yardımcı olabilecek birkaç başka model olduğunu unutmayın. Bununla birlikte, hepsini açıklayamam, bu yüzden normal- expressions.info'nun referans bölümüne bir göz atın .

Ray'in önerdiği gibi, "izin verilen karakterleri tanımla" yaklaşımına daha az kısıtlayıcı bir alternatif:

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

Normal ifade, herhangi bir dilde harf olmayan ve ayırıcı olmayan her şeyle eşleşir (boşluk, satır sonu vb.). Kullanamayacağınıza dikkat edin [\P{L}\P{Z}](büyük harf P, bu özelliğe sahip olmamak anlamına gelir), çünkü bu, "harf olmayan veya beyaz boşluk olmayan her şey" anlamına gelir, bu neredeyse her şeyle eşleşir, çünkü harfler beyaz boşluk değildir ve bunun tersi de geçerlidir.

Unicode hakkında ek bilgiler

Bazı unicode karakterleri, onları kodlamanın farklı olası yolları nedeniyle (tek bir kod noktası veya kod noktalarının bir kombinasyonu olarak) sorunlara neden oluyor gibi görünmektedir. Daha fazla bilgi için lütfen normal-ifadeler.info'ya bakın .


En iyi genel amaçlı çözüm için +1. Eğer OP ayrıntılar yokluğunda birkaç varyasyonları listeleme olduğundan, siz de göstermek ve benzeri şekilleri açıklayabilir[\P{L}]
Ray Toal

Ayrıca, -karakterin listedeki ilk veya sonuncu karakter olması veya kaçılması gerektiğini unutmayın .
kapex

[^\\p{L}\\p{Z}]Görünüşe göre Almanca Umlaut'ları (ä, ö, ü) de ortadan kaldırıyor (en azından benim için öyle yapıyor: /), bu nedenle "Normal ifade herhangi bir dilde olmayan her şeyle eşleşiyor"% 100 doğru görünmüyor
Peter

@Peter benim testlerimde o karakterleri ortadan kaldırmıyor. Sizin durumunuzda başka bir sorun olabilir, örneğin metnin farklı bir kodlaması. Daha fazla bilgi için bir bağlantı ekleyeceğim.
Thomas

1
@Thomas String result = yourString.replaceAll("[^\w\s]","");hata yapıyorInvalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
Visruth


18

Burada açıklandığı gibi http://developer.android.com/reference/java/util/regex/Pattern.html

Desenler düzenli ifadeler olarak derlenir. Birçok durumda, kolaylık gibi yöntemler String.matches, String.replaceAllve String.splittercih olacaktır, ancak aynı düzenli ifade ile çok çalışma yapmak gerekir, eğer bir kez derlemek ve yeniden kullanmak daha verimli olabilir. Pattern sınıfı ve arkadaşı Matcher, String tarafından sunulan küçük miktardan daha fazla işlevsellik sunar.

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

Sonuç

String is = one
Number is = 9196390097

Bu, arapça karakterleri kaldıracak
S0haib Nasir

15

Sınıfın replaceAll()yöntemini deneyin String.

BTW burada yöntem, dönüş türü ve parametrelerdir.

public String replaceAll(String regex,
                         String replacement)

Misal:

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

Kaldırmak istediğiniz tüm {'^', '+', '-'} karakterleri kaldırmalıdır!


6

Özel karakteri kaldırmak için

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

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

Çıktı şu şekilde olacaktır: abdd.

Bu mükemmel çalışıyor.


1
düz dizede geçersiz kaçış karakteri alacak
John Joe

Bu, boşlukları korumak istiyorsanız, boşlukları da kaldıracaktır ve ardından t2 = t2.replaceAll ("[^ \\ w \\ s]", "");
Isuru Dilshan

2

String.replaceAll()Java'daki yöntemi kullanın . replaceAll , sorununuz için yeterince iyi olmalıdır.


1

Tek karakteri aşağıdaki gibi kaldırabilirsiniz:

String str="+919595354336";

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

 System.out.println(result);

ÇIKTI:

919595354336

0

Eğer sadece java'da birebir değiştirme yapmak istiyorsanız, Pattern.quote(string)herhangi bir dizeyi değişmez değere çıkarmak için kullanın .

myString.replaceAll(Pattern.quote(matchingStr), replacementStr)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.