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


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 in \ new - это то, что спровоцировало это. Я не совсем уверен, как найти и заменить это, хотя идет поиск регулярного выражения на специальных символах whitespate
— Will Buck

1
Экранированы ли входы / как они назначены? var Input = "\\test\red\bob\fred\new"эта строка не содержит «красный», поэтому ваша первая попытка верна, вы тестируете против литерала "\\\\test\\red\\bob\\fred\\new"?
— Алекс К.

/[^\w\s]+/giпопробуй это.
— Бартош Гржибовски

Наверное, вопрос в том, представляют ли обратные слеши в вашей входной строке специальные символы? (Исходя из вашего примера, я думаю, нет.)
— Дейв

Пробовал переходить с двойных кавычек на одинарные?
— 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 (), когда строка исходит из ненадежного источника? Есть ли проблемы с безопасностью, чтобы не делать этого? Спасибо!
— Джубмуссо

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 = "\\ test \ red \ bob \ fred \ new" -> copy_paste = "\\\\ test \\ red \\ bob \\ fred \\ new".
— Флавио

-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
Если вы хотите предложить «вы должны избегать всех обратных слешей ()», то вам нужно предоставить пример того, как это сделать.
— Бобби Кэннон

Что вы думаете, двойные обратные слеши ??? и что я имею в виду, говоря «Когда вы пишете \\ test \\ red \\ bob \\ fred \\ new, ваша строка на самом деле содержит одиночные обратные слеши». ??? Разве это не объясняет?
— shift66

Ввод "\\ test \ red \ bod \ fred \ new" и не может измениться. Мне нужно решение для этой входной строки. Если вы хотите показать мне, как «убрать обратную косую черту», ​​приведите пример. Мы не можем изменить вход. Смотрите принятый ответ. Решение позволило входу не измениться, но дало желаемый результат.
— Бобби Кэннон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.