Usuń wszystkie znaki specjalne z wyjątkiem spacji z ciągu za pomocą JavaScript


157

Chcę usunąć wszystkie znaki specjalne z wyjątkiem spacji z ciągu za pomocą JavaScript.

Na przykład abc's test#s powinien wyświetlać jako abcs tests.


3
Jak definiujesz specjalny charakter?
Keith Irwin,

Odpowiedzi:


348

Powinieneś użyć funkcji zamiany napisów z pojedynczym wyrażeniem regularnym. Zakładając, że przez znaki specjalne masz na myśli wszystko, co nie jest literą, oto rozwiązanie:

const str = "abc's test#s";
console.log(str.replace(/[^a-zA-Z ]/g, ""));


5
Aby korzystać z tego rozwiązania na non-alfabetu łacińskiego sprawdź tę odpowiedź out
efkan

Spowoduje to również usunięcie znaków numerycznych!
tech_geek

15
@tech_geek you can tostr.replace(/[^a-zA-Z0-9]/g, "")
Chidi Williams

2
Właściwie potrzebujesz tego str.replace(/[^a-zA-Z0-9 ]/g, "");powiadomienia, jest spacja między 0-9 a]
Ammar Shah

Potrzebuje trochę poprawek, nie usunęło / lub - znaków i pierwsza litera camelCase miała być małymi literami, ale ta duża.
Sansun

133

Możesz to zrobić, określając znaki, które chcesz usunąć:

string = string.replace(/[&\/\\#,+()$~%.'":*?<>{}]/g, '');

Alternatywnie, aby zmienić wszystkie znaki z wyjątkiem cyfr i liter, spróbuj:

string = string.replace(/[^a-zA-Z0-9]/g, '');

4
co jeśli nie chcę usuwać miejsca za pomocą tego? /[^a-zA-Z0-9]/g
aadi1295

8
@ArbazAbid, aby zachować miejsce, po prostu dodaj to do białych znaków. Twoje wyrażenie regularne to „/ [^ a-zA-Z0-9] / g” (zauważ białe spacje po 9)
Crhistian Ramirez,

1
To była odpowiedź, która zadziałała, jeśli potrzebna jest przestrzeń.
Nathan

to zastępuje ()i whitespacesw łańcuchu.text().replace(/[ ()]/g, '')
C Alonso C Ortega

30

Pierwsze rozwiązanie nie działa dla żadnego alfabetu UTF-8. (Wytnie tekst, taki jak Привіт). Udało mi się stworzyć funkcję, która nie korzysta z RegExp i korzysta z dobrej obsługi UTF-8 w silniku JavaScript. Pomysł jest prosty, jeśli symbol jest równy wielkimi i małymi literami, jest to znak specjalny. Jedyny wyjątek dotyczy białych znaków.

function removeSpecials(str) {
    var lower = str.toLowerCase();
    var upper = str.toUpperCase();

    var res = "";
    for(var i=0; i<lower.length; ++i) {
        if(lower[i] != upper[i] || lower[i].trim() === '')
            res += str[i];
    }
    return res;
}

Aktualizacja: Należy pamiętać, że to rozwiązanie działa tylko w językach, w których występują małe i duże litery. W językach takich jak chiński to nie zadziała.

Aktualizacja 2: doszedłem do oryginalnego rozwiązania, kiedy pracowałem nad wyszukiwaniem rozmytym. Jeśli próbujesz również usunąć znaki specjalne w celu zaimplementowania funkcji wyszukiwania, istnieje lepsze podejście. Użyj dowolnej biblioteki transliteracji, która utworzy łańcuch tylko ze znaków łacińskich, a proste Regexp wykona całą magię usuwania znaków specjalnych. (To zadziała również dla języka chińskiego, a także otrzymasz dodatkowe korzyści, wykonując Tromsø== Tromso).


Dziękuję za to dość kreatywne rozwiązanie. Jest to o wiele bardziej zgodne z tym, jak faktycznie działają języki, ponieważ wielu z nas nie bierze pod uwagę znaków specjalnych „Привіт” lub „æøå”. Większość dostępnych rozwiązań usuwa znaki, które nie są częścią alfabetu angielskiego.
Alex Langberg

1
Prawie idealna odpowiedź dla mnie, ale niestety uważa chińskie znaki za znaki specjalne.
Eric Majerus

@EricMajerus i hindi też
programista

Uważaj, to również traktuje liczby jako znaki specjalne.
just_user,

11

Nie znam JavaScript, ale czy nie jest możliwe użycie wyrażenia regularnego?

Coś takiego jak [^\w\d\s]będzie pasować do wszystkiego oprócz cyfr, znaków i spacji. Byłoby tylko kwestią znalezienia składni w JavaScript.


1
stackoverflow.com/a/4374890/2384606 To jest odpowiedź na twoje pytanie :)
Carmela

8

Wypróbowałem bardzo kreatywne rozwiązanie firmy Seagul, ale okazało się, że traktuje cyfry również jako znaki specjalne, co nie odpowiada moim potrzebom. Oto moja (bezpieczna) modyfikacja rozwiązania Seagul ...

//return true if char is a number
function isNumber (text) {
  if(text) {
    var reg = new RegExp('[0-9]+$');
    return reg.test(text);
  }
  return false;
}

function removeSpecial (text) {
  if(text) {
    var lower = text.toLowerCase();
    var upper = text.toUpperCase();
    var result = "";
    for(var i=0; i<lower.length; ++i) {
      if(isNumber(text[i]) || (lower[i] != upper[i]) || (lower[i].trim() === '')) {
        result += text[i];
      }
    }
    return result;
  }
  return '';
}

Zapomniałeś zadeklarować regw swojej pierwszej funkcji.
Noman Ali

6

szukaj wszystkiego nie (znaki słowne || spacja):

str.replace(/[^\w ]/, '')

1

Spróbuj użyć tego

var result= stringToReplace.replace(/[^\w\s]/gi, '')

tutaj ^ karat oznacza negację \ w dla [a-zA-Z0-9_] znaków słownych i \ s dla spacji / [] / gi dla globalnego


0

kropka (.) nie może być uznana za specjalną. Dodałem warunek LUB do odpowiedzi Mozfeta i Seagull:

function isNumber (text) {
      reg = new RegExp('[0-9]+$');
      if(text) {
        return reg.test(text);
      }
      return false;
    }

function removeSpecial (text) {
  if(text) {
    var lower = text.toLowerCase();
    var upper = text.toUpperCase();
    var result = "";
    for(var i=0; i<lower.length; ++i) {
      if(isNumber(text[i]) || (lower[i] != upper[i]) || (lower[i].trim() === '') || (lower[i].trim() === '.')) {
        result += text[i];
      }
    }
    return result;
  }
  return '';
}

0

const input = `#if_1 $(PR_CONTRACT_END_DATE) == '23-09-2019' # 
Test27919<alerts@imimobile.com> #elseif_1 $(PR_CONTRACT_START_DATE) ==  '20-09-2019' #
Sender539<rama.sns@gmail.com> #elseif_1 $(PR_ACCOUNT_ID) == '1234' #
AdestraSID<hello@imimobile.co> #else_1#Test27919<alerts@imimobile.com>#endif_1#`;
const replaceString = input.split('$(').join('->').split(')').join('<-');


console.log(replaceString.match(/(?<=->).*?(?=<-)/g));


-11

Czyje znaki specjalne chcesz usunąć z ciągu, przygotuj ich listę, a następnie użyj funkcji zamiany javascript, aby usunąć wszystkie znaki specjalne.

var str = 'abc'de#;:sfjkewr47239847duifyh';
alert(str.replace("'","").replace("#","").replace(";","").replace(":",""));

lub możesz uruchomić pętlę dla całego ciągu i porównać pojedynczy znak z kodem ASCII i ponownie wygenerować nowy ciąg.


9
Nie, proszę, nie rób tego. Jest naprawdę strasznie powolny. O wiele lepiej jest używać wyrażeń regularnych.
Keith Irwin,

To rozwiązanie jest bardzo przyjemne do zastąpienia tylko jednej postaci. W moim przypadku było to pomocne, dzięki.
Vahid Najafi

Zamiast wielokrotnie używać metody replace, użyj go tylko raz, używając wyrażeń regularnych.
FAISAL
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.