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


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.