Удалите из строки не буквенно-цифровые символы. Возникли проблемы с символом [\]

Я хочу преобразовать следующую строку в предоставленный вывод.

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(/['`[email protected]#$%^&*()_|+-=?;:'",.<>\{\}\[\]\\\/]/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"

Ответ 1

Удаление не-буквенно-цифровых символов

Ниже приведено правильное регулярное выражение для правильного выражения не буквенно-цифровых символов из входной строки:

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""

Но они также удаляются с помощью регулярного выражения замены.

Ответ 2

У всех текущих ответов все еще есть причуды, лучшее, что я мог придумать, было:

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

Вот пример, который фиксирует каждый ключ, который я могу найти на клавиатуре:

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

Выходы: '123abcABC'

Ответ 3

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

Это только первая обратная косая черта во вводе, которая является символом обратной косой черты, остальные являются частью управляющих символов \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/

Ответ 4

вы можете попробовать это регулярное выражение:

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

Ответ 5

Если вы хотите иметь эту строку \\test\red\bob\fred\new, вам следует избегать всех обратных косых черт (\). Когда вы пишете \\test\\red\\bob\\fred\\new, ваша строка фактически содержит одну обратную косую черту. Вы можете быть уверены, что это напечатает вашу строку.
Поэтому, если обратные косые черты в вашей строке экранированы, myString.replace(/\W/g,'') будет работать нормально.