Видаліть усі спеціальні символи за допомогою RegExp


234

Я хотів би RegExp, який видалить усі спеціальні символи з рядка. Я намагаюся щось подібне, але це не працює в IE7, хоча працює у Firefox.

var specialChars = "!@#$^&%*()+=-[]\/{}|:<>?,.";

for (var i = 0; i < specialChars.length; i++) {
  stringToReplace = stringToReplace.replace(new RegExp("\\" + specialChars[i], "gi"), "");
}

Докладний опис RegExp також буде корисним.


18
Щось подібне було б краще, як білий список, а не чорний список. тоді ви могли просто зробити [az] | [0-9] | \ s
— Ape-inago

Будь-яка помилка сценарію? Ви налагодили? Або ж поставте спробувати ... блок блоку в коді javascript.
— Кангкан

@ Ape-inago Ви можете, будь ласка, поясніть RegExp трохи більше мені, будь ласка
— Тимофі Руле

3
Будь ласка, визначте "спеціальний символ"! "風" для вас особливий? (Думаючи про це, ви побачите точку @ Ape-iango.)
— демалі

7
Я не думаю, що тут хтось мав на увазі будь-яке правопорушення. Я раніше спалювався, роблячи це як чорний список, оскільки завжди є ті маленькі "готчі", які в кінцевому підсумку проходять (наприклад, приклади обману). Зрештою, правильний підхід стосується того, чому ви намагаєтеся це зробити.
— Ape-inago

Відповіді:


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

Як згадувалося в коментарях, простіше зробити це як білий список - замініть символи, які відсутні у вашому сафілістичному списку.

Символ caret ( ^) - це заперечення безлічі [...], giскажімо, глобального та нечутливого до регістру (останнє є трохи надмірним, але я хотів це зазначити), а сафеліст у цьому прикладі - цифри, символи слова, підкреслення ( \w) та пробіли ( \s).


50
Це рішення не працює для не англійських символів. Наприклад, "Їжак".
— Чайка

4
Ви також можете використовувати великі регістри \ W замість ^ \ w. \ W: відповідає будь-якому символу, який не має слова. Еквівалентно [^ A-Za-z0-9_]. developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…
— delkant

@Seagull Я додав відповідь, яка обробляє Unicodes.
— фредев

1
щоб прийняти слова наголосів, як, наприклад, у португальській мові, зробіть це: stringToReplace.replace (/ [^ A-zÀ-ú \ s] / gi, '')
— alansiqueira27

1
Щоб додати більшість європейських мов (норвезька, шведська, німецька, португайська, іспанська) stringToReplace.replace (/ [^ \ w \ s \ xc0-xff] / gi, ''). Для включення інших мов можна використовувати діапазони унікоду. Див: stackoverflow.com/questions/150033 / ...
— Eskil Mjelva Saatvedt

105

Зауважте, що якщо ви все ще хочете виключити набір, включаючи такі речі, як коса риса та спеціальні символи, ви можете зробити наступне:

var outString = sourceString.replace(/[`~!@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, '');

візьміть особливу увагу, що для того, щоб також включити символ "мінус", вам потрібно уникнути його з нахилом, як і остання група. якщо ви цього не зробите, також виберіть 0-9, що, мабуть, небажано.


10
відмінне рішення! прийнята відповідь працює лише англійською, це працює на будь-яких мовах (наскільки я перевірив). дякую :)
— Ронен Несс

1
@knutole вийміть ?із частини набору символів на передню частину. у цьому списку перелічені символи, які ви хочете видалити, тому виключення його з роздягання по суті включить його до кінцевого результату.
— noinput

Це чудово працює, ідеально підходить для будь-якої мови, просто потрібно додати таблицю, яку ви хочете замінити, і це все. Дякую.
— Елрос Ромео

21

Звичайний регулярний вираз JavaScript не обробляє літери Unicode .

Не використовуйте [^\w\s], це видалить букви з наголосами (наприклад, àèéìòù), не кажучи вже про кирилицю чи китайську, листи з таких мов будуть завершені видалені.

Ви дійсно не хочете видаляти ці літери разом із усіма спеціальними символами. У вас є два шанси:

  • Додати в своєму регулярному виразі все спеціальні символи , які ви не хочете видалити,
    наприклад: [^èéòàùì\w\s].
  • Погляньте на xregexp.com . XRegExp додає базову підтримку для узгодження Unicode через \p{...}синтаксис.

var str = "Їжак::: résd,$%& adùf"
var search = XRegExp('([^?<first>\\pL ]+)');
var res = XRegExp.replace(str, search, '',"all");

console.log(res); // returns "Їжак::: resd,adf"
console.log(str.replace(/[^\w\s]/gi, '') ); // returns " rsd adf"
console.log(str.replace(/[^\wèéòàùì\s]/gi, '') ); // returns " résd adùf"
<script src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/3.1.1/xregexp-all.js"></script>


3
Приємно знати про інтернаціоналізацію, я не мав уявлення, що JS regex не налаштований на UTF-8.
— LessQuesar

Ви не можете помістити всі дійсні букви UTF-8 у var str
— Чайка

@Seagull так, але у випадку, якщо ви не пишете сумісну програму у всьому світі, ви можете практично застосувати лише список дійсних літер UTF-8 для ваших поточних локалізацій. У моєму випадку для італійської мови є лише кілька букв.
— фредев

7

Перше рішення не працює для жодного алфавіту 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).


Чудово, як ця відповідь! Я використовую його для створення допустимого імені файлу, і він розширив ваше рішення для видалення пробілів (сумісних з Linux / Unix) та дозволу номерів. Тому я розширив оператор if (jQuery задіяний): if (str [i]! == '' && (нижній [i]! = Верхній [i] || нижній [i] .trim () === '' | | $ .isNumeric (str [i])))
— Jonny

у багатьох мовах немає великих літер ... тому функція вважатиме дійсними введення спеціальними символами
— Яїр Леві

Китайські ієрогліфи - один із прикладів, які цим позбавляються
— lethek

Коли я створив це рішення, на жаль, я не думав про такі мови, як китайська. Рішення потрібно запропонувати, оскільки попередні відповіді також не спрацюють.
— Чайка

1

Я використовую RegexBuddy для налагодження своїх регексів, він майже всі мови дуже корисний. Чим скопіювати / вставити для цільової мови. Страхітливий інструмент і не дуже дорогий.

Тому я копіюю / вставляю ваш регулярний вираз, і ваше питання полягає в тому, що [,] є спеціальними символами в регулярному виразі, тому вам потрібно уникнути їх. Таким чином, регулярний вираз повинен бути: /!@#$^&%*()+=- evidence\x5B\x5Dcharge\/{}|:<>?,./im


0

чому ти не робиш щось на кшталт:

re = /^[a-z0-9 ]$/i;
var isValid = re.test(yourInput);

щоб перевірити, чи містить ваш внесок якісь спеціальні знаки


17
ОП каже, що він намагається видалити спеціальні символи, не бачачи, чи вони існують.
— annakata

Це хороше рішення, але це дозволить лише цифри літер англійського алфавіту та пробіл, але воно видалить символи на кшталт, èéòàùìа в деяких випадках це не буде рішенням
— mapmalith

0

str.replace(/\s|[0-9_]|\W|[#$%^&*()]/g, "")Я зробив щось таке. Але є люди, які робили це набагато простіше, якstr.replace(/\W_/g,"");


Більшість речей у вашому підході є зайвими, оскільки \Wмістить деякі символи. Але навіщо ви фільтруєте числа? Це не особливі персонажі.
— user4642212
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.