Jak usunąć znaki specjalne z ciągu?


90

Chcę usunąć znaki specjalne, takie jak:

- + ^ . : ,

z ciągu znaków przy użyciu języka Java.


Najwyraźniej już wiesz, jakie wyrażenie regularne jest oparte na tym, jak otagowałeś swoje pytanie. Czy próbowałeś przeczytać dokumentację dla Stringklasy? W szczególności poszukaj słowa „regex”; metod jest kilka, a trochę przemyślenia powinno ci podpowiedzieć, jak postępować ... :)
Karl Knechtel

3
Wyrażenie „znak specjalny” jest tak nadużywane, że jest prawie całkowicie bez znaczenia. Jeśli chodzi o to, że „Mam tę listę konkretnych znaków, które chcę usunąć”, zrób tak, jak sugeruje Thomas, i utwórz swój wzorzec z klasą znaków wyrażenia regularnego i usuń replaceAllje. Jeśli masz bardziej ezoteryczne wymagania, edytuj pytanie. :)
Ray Toal

1
to nie są znaki specjalne ... to są: äâêíìéè, ponieważ nie są one twoimi typowymi jednobajtowymi typami znaków, jak - + ^ są ... w każdym razie, jak stwierdził Ray, albo zrób replaceAlldla nich a, albo wykonaj parsowanie ciąg, dodaj znaki, które nie są znakami, które chcesz usunąć, do innego ciągu, a na końcu po prostu zrób + = do ciągu, który będziesz zwracać.
Gonçalo Vieira

deleteChars.apply( fromString, "-+^.:," );- znajdź deleteChars tutaj
Kaplan

Odpowiedzi:


255

To zależy od tego, co zdefiniujesz jako znaki specjalne, ale spróbuj replaceAll(...):

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

Zwróć uwagę, że ^znak nie może być pierwszym na liście, ponieważ wtedy albo musiałbyś go uciec, albo oznaczałoby to „dowolne znaki oprócz tych”.

Kolejna uwaga: -znak musi być pierwszym lub ostatnim na liście, w przeciwnym razie musiałbyś go uciec lub zdefiniowałby zakres (np. :-,Oznaczałoby „wszystkie znaki w zakresie :do ,).

Tak więc, w celu utrzymania spójności i nie zależą od położenia znaków, może chcesz uciec tych wszystkich znaków, które mają specjalne znaczenie w wyrażeniach regularnych (poniższa lista nie jest kompletna, więc zdawać sobie sprawę z innymi postaciami podoba (, {, $ itd.) :

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


Jeśli chcesz pozbyć się wszystkich znaków interpunkcyjnych i symboli, wypróbuj to wyrażenie regularne: \p{P}\p{S}(pamiętaj, że w napisach Java musisz pominąć ukośniki:) "\\p{P}\\p{S}".

Trzecim sposobem może być coś takiego, jeśli możesz dokładnie zdefiniować, co powinno pozostać w twoim ciągu:

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

To znaczy: zamień wszystko, co nie jest znakiem słowa (w każdym przypadku az, 0-9 lub _) lub białą spacją.

Edycja: pamiętaj, że istnieje kilka innych wzorców, które mogą okazać się pomocne. Jednak nie mogę ich wszystkich wyjaśnić, więc zajrzyj do sekcji referencyjnej regular-expressions.info .

Oto mniej restrykcyjna alternatywa dla podejścia „zdefiniuj dozwolone znaki”, zgodnie z sugestią Raya:

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

Wyrażenie regularne pasuje do wszystkiego, co nie jest literą w żadnym języku i nie jest separatorem (białe znaki, podział wiersza itp.). Zauważ, że nie możesz użyć [\P{L}\P{Z}](duże P oznacza brak tej właściwości), ponieważ oznaczałoby to „wszystko, co nie jest literą lub białymi znakami”, co prawie pasuje do wszystkiego, ponieważ litery nie są białymi spacjami i odwrotnie.

Dodatkowe informacje o Unicode

Niektóre znaki Unicode wydają się powodować problemy ze względu na różne możliwe sposoby ich kodowania (jako pojedynczy punkt kodowy lub kombinacja punktów kodowych). Więcej informacji można znaleźć na stronie regular-expressions.info .


+1 za najlepsze rozwiązanie ogólnego przeznaczenia. Ponieważ wymieniasz kilka wariantów w przypadku braku szczegółów z PO, równie dobrze możesz pokazać i wyjaśnić wzorce, takie jak[\P{L}]
Ray Toal

Zauważ również, że -znak musi być pierwszym lub ostatnim na liście lub musi zostać zmieniony.
kapex

[^\\p{L}\\p{Z}]wydaje się eliminować również niemieckie umlauty (ä, ö, ü) (przynajmniej w moim przypadku: /), więc wyrażenie „wyrażenie regularne pasuje do wszystkiego, co nie jest literą w żadnym języku” nie wydaje się być w 100% poprawne
Peter

@Peter nie eliminuje tych znaków w moich testach. W Twoim przypadku może być inny problem, np. Inne kodowanie tekstu. Dodam link do dalszych informacji.
Thomas

1
@ Thomas String result = yourString.replaceAll("[^\w\s]","");popełnia błądInvalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
Visruth,


18

Jak opisano tutaj http://developer.android.com/reference/java/util/regex/Pattern.html

Wzorce to kompilowane wyrażenia regularne. W wielu przypadkach, metody takie jak wygoda String.matches, String.replaceAlli String.splitbędzie korzystne, ale jeśli trzeba zrobić dużo pracy z tego samego wyrażenia regularnego, może okazać się bardziej skuteczne, aby skompilować go raz i używać go. Klasa Pattern i jej odpowiednik, Matcher, również oferują większą funkcjonalność niż niewielka ilość udostępniana przez 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;
 }
}

Wynik

String is = one
Number is = 9196390097

Spowoduje to usunięcie arabskich znaków
S0haib Nasir

15

Wypróbuj replaceAll()metodę Stringklasy.

BTW tutaj jest metoda, typ zwrotu i parametry.

public String replaceAll(String regex,
                         String replacement)

Przykład:

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

Powinien usunąć wszystkie znaki {'^', '+', '-'}, które chciałeś usunąć!


6

Aby usunąć znak specjalny

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

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

Wynik będzie: abdd.

To działa doskonale.


1
otrzyma niedozwolony znak zmiany znaczenia w literale ciągu
John Joe

Spowoduje to również usunięcie spacji, jeśli chcesz zachować spacje, a następnie użyj t2 = t2.replaceAll ("[^ \\ w \\ s]", "");
Isuru Dilshan


1

Możesz usunąć pojedynczy znak w następujący sposób:

String str="+919595354336";

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

 System.out.println(result);

WYNIK:

919595354336

0

Jeśli chcesz tylko zamienić literał w java, użyj, Pattern.quote(string)aby zmienić dowolny ciąg na literał.

myString.replaceAll(Pattern.quote(matchingStr), replacementStr)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.