Jak zamienić znaki specjalne w ciągu?


Odpowiedzi:


187

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:


kiedy używam tej funkcji, usuwa również wszystkie cyfry. ale nie chcę, aby numery były usuwane. po prostu chcę usunąć znaki specjalne. Proszę zasugerować coś ..
Tanu

cóż, powiedziałeś, że chcesz tylko alfabetu. Ale zaktualizuję moją odpowiedź za minutę
Sean Patrick Floyd

Chcę połączyć ciąg, ale z pewnym warunkiem, takim jak 1. Jeśli jest tylko jeden wynik, konkatowanie nie jest wymagane 2.Jeśli wynik jest większy niż 1, niż ciąg konkatowany w następującej formie: stos + ponad + przepływ
Tanu

2
@Tanu to inne pytanie. Zrób to nowy
Pekka

A jeśli nie chcę usuwać spacji? lub powiedzieć, że wszystkie spacje, jak tabulatory, znaki nowej linii zwinięte jako tylko jedna spacja?
przeklęty

74

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


Nie działa dla <script> alert ('XSS Attack') </script>. Jak usunąć znaki „<”, „>”, „\”?
Manoj

11

Aby zachować znaki alfanumeryczne, możesz użyć następującej metody.

replaceAll("[^a-zA-Z0-9]", "");

A jeśli chcesz zachować tylko znaki alfabetyczne, użyj tego

replaceAll("[^a-zA-Z]", "");

6
Do użytku kosmicznegoreplaceAll("[^a-zA-Z0-9 ]", "");
Qamar

6

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


Zdecydowanie tego szukałem, gdy zobaczyłem tytuł pytania "Jak zamienić znaki specjalne w ciągu?" dzięki!
Pan Drew

2
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.


2

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


0

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.



-1
let name = name.replace(/[&\/\\#,+()$~%!.„'":*‚^_¤?<>|@ª{«»§}©®™ ]/g, '').toLowerCase();

Czy możesz trochę wyjaśnić to wyrażenie regularne?
stdunbar

Zalecam dodanie uwag w sekcji odpowiedzi, aby wyjaśnić kod. Przeczytaj więcej o tym, jak pisać dobre odpowiedzi .
Joe Ferndz

To naprawdę nie odpowiada na pytanie. Jeśli masz inne pytanie, możesz je zadać, klikając Zadaj pytanie . Możesz także dodać nagrodę, aby zwrócić większą uwagę na to pytanie, gdy zdobędziesz wystarczającą reputację . - Z recenzji
Aman Garg
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.