Mam ciąg z wieloma znakami specjalnymi. Chcę je wszystkie usunąć, ale zachowaj litery alfabetu.
Jak mogę to zrobić?
Odpowiedzi:
To zależy od tego, co masz na myśli. Jeśli chcesz się ich pozbyć, zrób to:
(Aktualizacja: najwyraźniej chcesz również zachować cyfry, w takim przypadku użyj drugiej linii)
String alphaOnly = input.replaceAll("[^a-zA-Z]+","");
String alphaAndDigits = input.replaceAll("[^a-zA-Z0-9]+","");
lub odpowiednik:
String alphaOnly = input.replaceAll("[^\\p{Alpha}]+","");
String alphaAndDigits = input.replaceAll("[^\\p{Alpha}\\p{Digit}]+","");
(Wszystko to można znacznie poprawić, wstępnie kompilując wzorzec wyrażenia regularnego i przechowując go w stałej)
Lub z guawą :
private static final CharMatcher ALNUM =
CharMatcher.inRange('a', 'z').or(CharMatcher.inRange('A', 'Z'))
.or(CharMatcher.inRange('0', '9')).precomputed();
// ...
String alphaAndDigits = ALNUM.retainFrom(input);
Ale jeśli chcesz zmienić znaki akcentowane w coś sensownego, co nadal jest ascii, spójrz na te pytania:
Używam tego.
s = s.replaceAll("\\W", "");
Zastępuje wszystkie znaki specjalne z łańcucha.
Tutaj
\ w: znak słowa, skrót od [a-zA-Z_0-9]
\ W: Znak niebędący słowem
Zastąp wszystkie znaki specjalne znakiem
replaceAll("\\your special character","new character");
np .: aby zamienić całe wystąpienie * na białe znaki
replaceAll("\\*","");
* ta instrukcja może w danym momencie zastąpić tylko jeden typ znaku specjalnego
string Output = Regex.Replace(Input, @"([ a-zA-Z0-9&, _]|^\s)", "");
Tutaj wszystkie znaki specjalne z wyjątkiem spacji, przecinka i ampersandu są zastępowane. Możesz również pominąć spację, przecinek i znak ampersand za pomocą następującego wyrażenia regularnego.
string Output = Regex.Replace(Input, @"([ a-zA-Z0-9_]|^\s)", "");
Gdzie Input to ciąg, który musimy zamienić znaki.
Idąc za przykładem odpowiedzi Andrzeja Doyle'a myślę, że lepszym rozwiązaniem jest zastosowanie org.apache.commons.lang3.StringUtils.stripAccents()
:
package bla.bla.utility;
import org.apache.commons.lang3.StringUtils;
public class UriUtility {
public static String normalizeUri(String s) {
String r = StringUtils.stripAccents(s);
r = r.replace(" ", "_");
r = r.replaceAll("[^\\.A-Za-z0-9_]", "");
return r;
}
}
Możesz użyć podstawowych wyrażeń regularnych na łańcuchach, aby znaleźć wszystkie znaki specjalne lub użyć wzorca i klas dopasowujących do wyszukiwania / modyfikowania / usuwania ciągów zdefiniowanych przez użytkownika. Ten link zawiera kilka prostych i łatwych do zrozumienia przykładów wyrażeń regularnych: http://www.vogella.de/articles/JavaRegularExpressions/article.html
Możesz pobrać kod Unicode dla tego śmieciowego znaku z narzędzia mapy znaków na komputerze z systemem Windows i dodać \ u np. \ U00a9 do symbolu praw autorskich. Teraz możesz użyć tego ciągu z tym konkretnym znakiem śmieciowym, nie usuwaj żadnych śmieciowych znaków, ale zastąp odpowiednim unikodem.
W przypadku spacji użyj tego wzorca „[^ az AZ 0-9]”
let name = name.replace(/[&\/\\#,+()$~%!.„'":*‚^_¤?<>|@ª{«»§}©®™ ]/g, '').toLowerCase();