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ć.
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,
40
Spowoduje to zastąpienie wszystkich znaków z wyjątkiem alfanumerycznych
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.
String
klasy? W szczególności poszukaj słowa „regex”; metod jest kilka, a trochę przemyślenia powinno ci podpowiedzieć, jak postępować ... :)replaceAll
je. Jeśli masz bardziej ezoteryczne wymagania, edytuj pytanie. :)replaceAll
dla 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ć.deleteChars.apply( fromString, "-+^.:," );
- znajdź deleteChars tutajOdpowiedzi:
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 .
źródło
[\P{L}]
-
znak musi być pierwszym lub ostatnim na liście lub musi zostać zmieniony.[^\\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% poprawneString result = yourString.replaceAll("[^\w\s]","");
popełnia błądInvalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
Spowoduje to zastąpienie wszystkich znaków z wyjątkiem alfanumerycznych
replaceAll("[^A-Za-z0-9]","");
źródło
Jak opisano tutaj http://developer.android.com/reference/java/util/regex/Pattern.html
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
źródło
Wypróbuj
replaceAll()
metodęString
klasy.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ąć!
źródło
Aby usunąć znak specjalny
String t2 = "!@#$%^&*()-';,./?><+abdd"; t2 = t2.replaceAll("\\W+","");
Wynik będzie:
abdd.
To działa doskonale.
źródło
Użyj
String.replaceAll()
metody w Javie. replaceAll powinno wystarczyć do rozwiązania problemu.źródło
Możesz usunąć pojedynczy znak w następujący sposób:
String str="+919595354336"; String result = str.replaceAll("\\\\+",""); System.out.println(result);
WYNIK:
919595354336
źródło
Jeśli chcesz tylko zamienić literał w java, użyj,
Pattern.quote(string)
aby zmienić dowolny ciąg na literał.źródło