Видаліть із рядка не буквено-цифрові символи


224

Я хочу перетворити наступний рядок на наданий вихід.

Input:  "\\test\red\bob\fred\new"
Output: "testredbobfrednew"

Я не знайшов ні одного рішення , яке буде обробляти спеціальні символи , такі як \r, \n, \bі т.д.

В основному я просто хочу позбутися всього, що не буквено-цифрове. Ось що я спробував ...

Attempt 1: "\\test\red\bob\fred\new".replace(/[_\W]+/g, "");
Output 1:  "testedobredew"

Attempt 2: "\\test\red\bob\fred\new".replace(/['`~!@#$%^&*()_|+-=?;:'",.<>\{\}\[\]\\\/]/gi, "");
Output 2:  "testedobred [newline] ew"

Attempt 3: "\\test\red\bob\fred\new".replace(/[^a-zA-Z0-9]/, "");
Output 3:  "testedobred [newline] ew"

Attempt 4: "\\test\red\bob\fred\new".replace(/[^a-z0-9\s]/gi, '');
Output 4:  "testedobred [newline] ew"

Ще одна спроба з декількома кроками

function cleanID(id) {
    id = id.toUpperCase();
    id = id.replace( /\t/ , "T");
    id = id.replace( /\n/ , "N");
    id = id.replace( /\r/ , "R");
    id = id.replace( /\b/ , "B");
    id = id.replace( /\f/ , "F");
    return id.replace( /[^a-zA-Z0-9]/ , "");
}

з результатами

Attempt 1: cleanID("\\test\red\bob\fred\new");
Output 1: "BTESTREDOBFREDNEW"

Будь-яка допомога буде вдячна.

Робоче рішення:

Final Attempt 1: return JSON.stringify("\\test\red\bob\fred\new").replace( /\W/g , '');
Output 1: "testredbobfrednew"

Цікаве запитання, що \ n в \ новому, явно, що це спонукає. Я не зовсім впевнений, як знайти і замінити те, що йде на пошуки регексу на спеціальних символах whitespate
Булл Бак

1
Чи уникаються входи / як вони призначаються? var Input = "\\test\red\bob\fred\new"ця рядок не містить "червоного", тому ваша перша спроба правильна, чи ви протестуєте на літтералі "\\\\test\\red\\bob\\fred\\new"?
Алекс К.

/[^\w\s]+/giспробуйте це.
Bartosz Grzybowski

Я думаю, питання полягає в тому, чи зворотні косої риси у вхідному рядку представляють спеціальні символи? (Виходячи з результатів вашого прикладу, я гадаю, що немає.)
Дейв

Спробували перехід від подвійних лапок до одиничних лапок?
OptimusCrime

Відповіді:


468

Видалення символів без буквено-цифрових знаків

Далі йде / правильний регулярний вираз, щоб зняти не алфавітно-цифрові символи з вхідного рядка:

input.replace(/\W/g, '')

Зауважте, що \Wце еквівалент [^0-9a-zA-Z_]- він включає символ підкреслення. Для видалення підкреслення використовуйте, наприклад:

input.replace(/[^0-9a-z]/gi, '')

Вхід неправильно сформований

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

Зворотній косий рядок в рядку повинен бути уникнутим, якщо це потрібно сприймати буквально:

"\\test\\red\\bob\\fred\\new".replace(/\W/g, '')
"testredbobfrednew" // output

Поводження з неправильно сформованими струнами

Якщо ви не в змозі уникнути правильного введення рядка (чому б ні?), Або він надходить з якогось ненадійного / неправильно налаштованого джерела - ви можете зробити щось подібне:

JSON.stringify("\\test\red\bob\fred\new").replace(/\W/g, '')
"testredbobfrednew" // output

Зауважте, що представлення json рядка включає лапки:

JSON.stringify("\\test\red\bob\fred\new")
""\\test\red\bob\fred\new""

Але вони також видаляються замісним регулярним виразом.


10
Це не знімає підкреслення.
kylex

4
@kylex, це тому, що підкреслення вважається частиною буквено-цифрових якихось причин
Євген Кузьменко

12
"Тому що вони символи, як правило, легальні у змінних ідентифікаторах." . У запитанні немає "_", звичайно заміщення \Wна [_\W](яке використовується в запитанні) або подібне, яке б усувало підкреслення.
AD7six

1
@ AD7six, ви можете, будь ласка, пояснити, чому слід використовувати JSON.stringify (), коли рядок надходить з ненадійного джерела? Чи є стурбованість безпекою, щоб цього не робити? Дякую!
jbmusso

1
@guithor Це не те, що "треба", або що це взагалі впливає на безпеку; Якщо "якась рядок" отримується і з будь-якої причини вона в основному не працює (Не видно з питання, чому рядок отримано неправильно) - це дозволяє бачити рядок таким, яким він є: jsfiddle.net/Z6N7C
AD7six

49

У всіх поточних відповідях все ще є примхи, найкраще, що я міг придумати, це:

string.replace(/[^A-Za-z0-9]/g, '');

Ось приклад, який фіксує кожну клавішу, яку я міг знайти на клавіатурі:

var string = '123abcABC-_*(!@#$%^&*()_-={}[]:\"<>,.?/~`';
var stripped = string.replace(/[^A-Za-z0-9]/g, '');
console.log(stripped);

Виходи: "123abcABC"


1
input.replace(/\W/g, '')листя в рядку _. @Deminetix правильно string.replace(/[^A-Za-z0-9]/g, '');працює, оскільки він видаляє всі не алфавітно-цифрові символи з рядка.
Тім

1
І все-таки жодна перестановка цієї відповіді насправді не відповідає на поставлене запитання .
AD7six

10

Проблема не в тому, як ви замінюєте символи, проблема в тому, як ви вводите рядок.

Це тільки перший зворотний слеш на вході , який є зворотною косою риси, інші є частиною керуючих символів \r, \b, \fі \n.

Оскільки ці рисові косої риси не є окремими символами, а є частиною позначення для написання єдиних контрольних символів, їх не можна видалити окремо. Тобто ви не можете зняти звороту косу рису, \nоскільки це не два окремих символи, це спосіб написання керуючого символу LFчи стрічки каналу .

Якщо ви гостро хочете перетворити цей вхід на потрібний вихід, вам потрібно буде замінити кожен керуючий символ відповідною буквою, наприклад, замінити символ \nсимволом n.

Для заміни керуючого символу потрібно використовувати набір символів типу [\r], як це \rмає спеціальне значення у звичайному виразі:

var input = "\\test\red\bob\fred\new";

var output = input
    .replace(/[\r]/g, 'r')
    .replace(/[\b]/g, 'b')
    .replace(/[\f]/g, 'f')
    .replace(/[\n]/g, 'n')
    .replace(/\\/g, '');

Демо: http://jsfiddle.net/SAp4W/


Я розумію все, що ви говорите, але питання все ще стоїть, і ніхто ще не запропонував правильної відповіді. Вхід може бути змінений, але ніхто не пропонує відповіді, як програмно змінити його в JS.
Боббі Кеннон

2
@BobbyCannon: Я додав код, який бере ваш точний вклад і дає потрібний вихід.
Гуффа

5

ви можете спробувати цей регулярний вираз:

value.replace(/[\W_-]/g, '');

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

0

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

function alpha_numeric_filter (string) {

  const alpha_numeric = Array.from('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' + ' ')

  const json_string = JSON.stringify(string)

  let filterd_string = ''

  for (let i = 0; i < json_string.length; i++) {

    let char = json_string[i]
    let index = alpha_numeric.indexOf(char)
    if (index > -1) {
      filterd_string += alpha_numeric[index]
    }

  }

  return filterd_string

}

const input = "\\test\red\bob\fred\new"
console.log(alpha_numeric_filter(input)) //=> testredbobfrednew

const complex_string = "/_&_This!&!! is!@#$% a%^&*() Sentence+=-[]{} 123:;\|\\]||~`/.,><"
console.log(alpha_numeric_filter(complex_string)) //=> This is a Sentence 123

Це не працює (будь ласка, прочитайте питання) - Це також досить складний спосіб робити справи.
AD7six

1
@ AD7six дякую за вказівку на мою помилку. Коли я копіюю вкладений вхід у WebStrom, він автоматично додає 2 додаткових косих косих риски до кожного існуючого косого кута. Я цього не помітив. input = "\\ тест \ червоний \ bob \ fred \ new" -> copy_paste = "\\\\ тест \\ червоний \\ bob \\ fred \\ новий".
Флавіо

-1

Ось приклад, який ви можете використовувати,

function removeNonAplhaNumeric(str){
    return str.replace(/[\W_]/g,"");
}

removeNonAplhaNumeric("0_0 (: /-\ :) 0-0");

-3

Якщо ви хочете мати цей \\test\red\bob\fred\newрядок, вам слід уникнути всіх зворотних нахилів ( \). Коли ви пишете, \\test\\red\\bob\\fred\\newваш рядок насправді містить поперечні риски. Ви можете бути впевнені в цій друку вашої струни.
Тож якщо уникнути зворотних косих рядків у рядку, myString.replace(/\W/g,'')то це працюватиме нормально.


1
Якщо ви хочете запропонувати "вам слід уникати всіх косих косих рисів ()", тоді вам потрібно навести приклад того, як це зробити.
Боббі Кеннон

Що ви робите подвійні нахили? і що я маю на увазі, кажучи "Коли ви пишете \\ тест \\ червоний \\ bob \\ fred \\ новий, ваш рядок насправді містить одинарні риски". ??? Це не пояснює?
зміна66

Вхід "\\ test \ red \ bod \ fred \ new" і не може змінитися. Мені потрібно рішення для цього вхідного рядка. Якщо ви хочете показати мені, як "уникнути зворотних нахилів", то наведіть приклад. Ми не можемо змінити вхід. Дивіться прийняту відповідь. Рішення дозволило вхід не змінитися, але дало бажаний вихід.
Боббі Кеннон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.