Видаліть усі спеціальні символи за допомогою 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.