Видаліть усі спеціальні символи, крім простору, з рядка за допомогою JavaScript


158

Я хочу видалити всі спеціальні символи, крім простору з рядка, за допомогою JavaScript.

Наприклад, abc's test#s слід виводити як abcs tests.


3
Як ви визначаєте спеціальний символ?
Кіт Ірвін

Відповіді:


350

Вам слід скористатись функцією заміни рядків, використовуючи один регулярний вираз. Маючи на увазі спеціальних символів, ви маєте на увазі все, що не письмо, ось рішення:

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


5
Для того, щоб використовувати це рішення на НЕ-латинському алфавіті , будь ласка , перевірте цю відповідь з
efkan

Це також видалить числові символи!
tech_geek

15
@tech_geek можна зробитиstr.replace(/[^a-zA-Z0-9]/g, "")
Чіді Вільямс

2
Насправді вам потрібне це str.replace(/[^a-zA-Z0-9 ]/g, "");повідомлення, пробіл між 0-9 та]
Аммар Шах

Це потребує певного підключення, він не видаляв / або - символи, а перший символ camelCase повинен бути в нижньому регістрі, але цей у великому регістрі.
Сансун

133

Ви можете зробити це, вказавши символів, які потрібно видалити:

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

Крім того, щоб змінити всі символи, крім цифр і літер, спробуйте:

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

4
що робити, якщо я не хочу видаляти простір за допомогою цього? /[^a-zA-Z0-9]/g
aadi1295

8
@ArbazAbid, щоб не залишати місця, просто додайте його до білих символів. ваш регекс буде "/ [^ a-zA-Z0-9] / g" (помітити пробіл після 9)
Crhistian Ramirez

1
Це була відповідь, яка спрацювала, якщо потрібен пробіл.
Натан

це замінює ()і whitespacesрядок.text().replace(/[ ()]/g, '')
C Alonso C Ortega

30

Перше рішення не працює для жодного алфавіту UTF-8. (Він виріже такий текст, як Привіт). Мені вдалося створити функцію, яка не використовує RegExp і використовує гарну підтримку UTF-8 в механізмі JavaScript. Ідея проста, якщо символ рівний великим, а малі - це особливий символ. Єдиний виняток зроблений для пробілів.

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

Оновлення: Зверніть увагу, що це рішення працює лише для мов, де є малі та великі літери. У таких мовах, як китайська, це не працює.

Оновлення 2: Я прийшов до оригінального рішення, коли працював над нечітким пошуком. Якщо ви також намагаєтеся видалити спеціальні символи для реалізації функцій пошуку, є кращий підхід. Використовуйте будь-яку бібліотеку транслітерації, яка видасть вам рядки лише з латинських символів, і тоді простий Regexp виконає всю магію видалення спеціальних символів. (Це також буде працювати для китайців, і ви також отримаєте побічні переваги, зробивши Tromsø== Tromso).


Дякую за це досить креативне рішення. Це набагато більше відповідає тому, як мови насправді працюють, оскільки багато хто з нас не вважають спеціальними символами "Привіт" чи "æøå". Більшість рішень там вирізають будь-які символи, які не входять до англійського алфавіту.
Алекс Лангберг

1
Майже ідеальна відповідь для мене, але, на жаль, він вважає китайських символів особливими символами.
Eric Majerus

@EricMajerus і хінді теж
програміст

Будьте уважні, це також розглядає числа як особливі символи.
just_user

11

Я не знаю JavaScript, але чи це неможливо за допомогою regex?

Щось подібне [^\w\d\s]відповідатиме будь-чому, окрім цифр, символів та пробілів. Було б лише питання знайти синтаксис у JavaScript.


1
stackoverflow.com/a/4374890/2384606 Це відповідь на ваше запитання :)
Carmela

8

Я спробував дуже креативне рішення 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 '';
}

Ви забули заявити regу своїй першій функції.
Номан Алі

6

шукати все не (пробіл символів || пробіл):

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

1

Спробуйте скористатися цим

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

тут ^ карат - це заперечення \ w для [a-zA-Z0-9_] символів слова та \ s для простору / [] / gi для глобального


0

крапка (.) не може вважатися особливою. Я додав умову АБО до відповіді Мозфета та Чайки:

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

Чиї спеціальні символи ви хочете видалити з рядка, підготуйте їх список, а потім користувачу функцію заміни javascript, щоб видалити всі спеціальні символи.

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

або ви можете запустити цикл для цілого рядка і порівняти один-єдиний символ з кодом ASCII і відновити новий рядок.


9
Ні, будь ласка, не робіть цього. Це дійсно страшно повільно. Це набагато, набагато краще використовувати регулярний вираз.
Кіт Ірвін

Це рішення дуже приємно для заміни лише одного символу. У моєму випадку це було корисно, дякую.
Вахід Наджафі

Замість використання методу заміни багато разів, будь ласка, використовуйте його один раз, використовуючи лише регулярні вирази.
Фейсал
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.