Удалить не буквенно-цифровые символы из строки. Возникли проблемы с персонажем [\] - PullRequest
191 голосов
/ 20 февраля 2012

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

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"

Ответы [ 6 ]

396 голосов
/ 20 февраля 2012

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

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

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

Обратите внимание, что \W является эквивалентом [^0-9a-zA-Z_] - оно включает символ подчеркивания. Для удаления подчеркивания используйте, например ::10000

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

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

46 голосов
/ 25 августа 2015

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

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

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

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

Выходы: '123abcABC'

10 голосов
/ 20 февраля 2012

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

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

5 голосов
/ 17 декабря 2015

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

value.replace(/[\W_-]/g, '');
0 голосов
/ 11 июня 2018

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

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
0 голосов
/ 20 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...