Удалите все специальные символы, кроме пробела, из строки, используя JavaScript

159

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

Например, abc's test#s должен выводить как abcs tests.

Nithi
источник
3
Как вы определяете специальный символ?
Кит Ирвин

Ответы:

351

Вы должны использовать функцию замены строки с одним регулярным выражением. Предполагая под специальными символами, вы имеете в виду все, что не буква, вот решение:

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 должен быть в нижнем регистре, но этот в верхнем регистре.
Сансун
134

Вы можете сделать это, указав символы, которые хотите удалить:

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)
Кристиан Рамирес
1
Это был ответ, который работал, если требуется место.
Натан
это заменяет ()и whitespacesв строке.text().replace(/[ ()]/g, '')
C Алонсо C Ортега
31

Первое решение не работает для любого алфавита 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
Почти идеальный ответ для меня, но, к сожалению, китайские иероглифы считаются специальными.
Эрик Мажерус
@EricMajerus и Hindi тоже
программист
Будьте осторожны, это также рассматривает числа как специальные символы.
just_user
11

Я не знаю JavaScript, но разве это невозможно с помощью регулярных выражений?

Нечто подобное [^\w\d\s]будет соответствовать чему угодно, кроме цифр, символов и пробелов. Было бы просто вопросом найти синтаксис в JavaScript.

Тьяго Мораес
источник
1
stackoverflow.com/a/4374890/2384606 Это ответ на ваш вопрос :)
Carmela
8

Я попробовал очень креативное решение Seagul, но обнаружил, что оно рассматривает числа также как специальные символы, которые не соответствуют моим потребностям. Итак, вот мой (отказоустойчивый) твик решения 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 '';
}
Mozfet
источник
Вы забыли объявить regв своей первой функции.
Номан Али
7

искать не все (символы слова || пробел):

str.replace(/[^\w ]/, '')
Довид
источник
идеальный! удаление всех специальных символов Юникода из строки.
abhishake
1

Попробуйте использовать это

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

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

Shrinivasan
источник
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 '';
}
hassanf1
источник
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 и создать новую строку.

Гаурав Агравал
источник
10
Нет, пожалуйста, не делай этого. Это действительно ужасно медленно. Намного лучше использовать регулярные выражения.
Кит Ирвин
Это решение очень удобно для замены только одного символа. В моем случае это было полезно, спасибо.
Вахид Наджафи
Вместо многократного использования метода replace, используйте его только один раз, используя регулярные выражения.
FAISAL