Remover caracteres não alfanuméricos da sequência

224

Desejo converter a seguinte string na saída fornecida.

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

Eu não encontrei qualquer solução que irá lidar com caracteres especiais como \r, \n, \b, etc.

Basicamente, eu só quero me livrar de qualquer coisa que não seja alfanumérica. Aqui está o que eu tentei ...

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"

Outra tentativa com várias etapas

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]/ , "");
}

com resultados

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

Qualquer ajuda seria apreciada.

Solução de trabalho:

Final Attempt 1: return JSON.stringify("\\test\red\bob\fred\new").replace( /\W/g , '');
Output 1: "testredbobfrednew"
Bobby Cannon
fonte
Pergunta interessante, o \ n in \ new é claramente o que está provocando isso. Eu não tenho muita certeza de como encontrar e substituir isso, embora vá procurar por expressões regulares em caracteres especiais em branco
Will Will
1
As entradas escaparam / como são atribuídas? var Input = "\\test\red\bob\fred\new"essa string não contém "vermelho", para que sua 1ª tentativa esteja correta, você está testando contra o litteral "\\\\test\\red\\bob\\fred\\new"?
Alex K.
/[^\w\s]+/gitente isso.
Bartosz Grzybowski
Acho que a pergunta é: as barras invertidas na string de entrada representam caracteres especiais? (Com base no seu exemplo de saída, eu estou nenhuma suposição.)
Dave
Tentou mudar de aspas duplas para aspas simples?
OptimusCrime

Respostas:

468

Removendo caracteres não alfanuméricos

A seguir está o / a regex correto para remover caracteres não alfanuméricos de uma sequência de entrada:

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

Observe que \Wé o equivalente a [^0-9a-zA-Z_]- inclui o caractere sublinhado. Para remover também sublinhados, use, por exemplo:

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

A entrada está malformada

Como a cadeia de teste contém vários caracteres de escape, que não são alfanuméricos, ela os removerá.

Uma barra invertida na cadeia precisa ser escapada para que seja tomada literalmente:

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

Manipulando Cordas Malformadas

Se você não conseguir escapar da string de entrada corretamente (por que não?), Ou se vier de algum tipo de fonte não confiável / configurada incorretamente - você pode fazer algo assim:

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

Observe que a representação json de uma string inclui as aspas:

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

Mas eles também são removidos pelo regex de substituição.

AD7six
fonte
10
Isso não remove os sublinhados.
precisa saber é
4
@kylex, isso é porque sublinhados são considerados uma parte do grupo alfanumérico, por algum motivo
Eugene Kuzmenko
12
"Porque eles são os caracteres tipicamente legais nos identificadores de variáveis". . Não há "_" na pergunta, é claro que substituir \Wpor [_\W](que é usado na pergunta) ou similar removeria sublinhados.
AD7six 01/03
1
@ AD7six, você poderia explicar por que alguém deveria estar usando JSON.stringify () quando a string vem de uma fonte não confiável? Existe alguma preocupação de segurança em não fazer isso? Obrigado!
Jbmusso
1
@ guithor Não é que "se deva", ou que isso afete a segurança; Se "alguma string" está sendo recebida e por qualquer motivo é basicamente borked (Não resulta da questão porque a corda é recebido malformado) - permite ver a string para o que é: jsfiddle.net/Z6N7C
AD7six
49

Todas as respostas atuais ainda têm peculiaridades, a melhor coisa que pude sugerir foi:

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

Aqui está um exemplo que captura todas as teclas que pude encontrar no teclado:

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

Saídas: '123abcABC'

Deminetix
fonte
1
input.replace(/\W/g, '')sai no _em uma String. O @Deminetix está certo string.replace(/[^A-Za-z0-9]/g, '');funciona melhor, pois remove todos os caracteres não alfanuméricos da String.
Tim
1
E, no entanto, nenhuma permutação dessa resposta realmente responde à pergunta .
precisa saber é o seguinte
10

O problema não está em como você substitui os caracteres, mas em como você insere a string.

É apenas a primeira barra invertida na entrada que é um caractere de barra invertida, os outros são parte dos caracteres de controle \r, \b, \fe \n.

Como essas barras invertidas não são caracteres separados, mas fazem parte da notação para escrever um único controle, eles não podem ser removidos separadamente. Ou seja, você não pode remover a barra invertida \n, pois não há dois caracteres separados, é o modo como você escreve o caractere de controle LFou o avanço de linha .

Se você deseja transformar essa entrada na saída desejada, precisará substituir cada caractere de controle pela letra correspondente, por exemplo, substituir o caractere \npelo caractere n.

Para substituir um caractere de controle, você precisa usar um conjunto de caracteres como [\r], pois \rpossui um significado especial em uma expressão regular:

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, '');

Demonstração: http://jsfiddle.net/SAp4W/

Guffa
fonte
Entendo tudo o que você está dizendo, mas a pergunta ainda permanece e ninguém sugeriu a resposta correta ainda. A entrada pode ser alterada, mas ninguém sugeriu uma resposta sobre como alterá-la programaticamente em JS.
Bobby Cannon
2
@BobbyCannon: adicionei código que pega sua entrada exata e produz a saída desejada.
Guffa
5

você pode tentar este regex:

value.replace(/[\W_-]/g, '');
myrcutio
fonte
de acordo com a pergunta: eu só quero me livrar de qualquer coisa que não seja alfanumérica. que saída você esperava?
myrcutio
0

Isso remove todos os caracteres não alfanuméricos, preserva maiúsculas e espaços entre as palavras.

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
Flavio
fonte
Isso não funciona (leia a pergunta) - também é uma maneira bastante complexa de fazer as coisas.
AD7six
1
@ AD7six obrigado por apontar o meu erro. Quando copiei e colei a entrada no WebStrom, ele adicionou automaticamente duas barras invertidas extras a cada barra invertida existente. Não consegui perceber isso. input = "\\ teste \ vermelho \ bob \ fred \ novo" -> copy_paste = "\\\\ teste \\ vermelho \\ bob \\ fred \\ novo".
Flavio
-1

Aqui está um exemplo que você pode usar,

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

removeNonAplhaNumeric("0_0 (: /-\ :) 0-0");
Ravi Kishore
fonte
-3

Se você deseja ter essa \\test\red\bob\fred\newstring, deve escapar de todas as barras invertidas ( \). Quando você escreve, \\test\\red\\bob\\fred\\newsua string realmente contém barras invertidas. Você pode ter certeza disso imprimindo sua string.
Portanto, se as barras invertidas em sua string forem escapadas myString.replace(/\W/g,''), funcionará normalmente.

shift66
fonte
1
Se você quiser sugerir "você deve escapar de todas as barras invertidas ()", precisará fornecer um exemplo de como fazê-lo.
Bobby Cannon
O que você acha são barras duplas ?? e o que quero dizer com "Quando você escreve \\ test \\ red \\ bob \\ fred \\ new, sua string realmente contém barras invertidas". ??? Isso não está explicando?
shift66
A entrada é "\\ test \ red \ bod \ fred \ new" e não pode ser alterada. Eu preciso de uma solução para essa string de entrada. Se você quiser me mostrar como "excape as barras invertidas", dê um exemplo. Não podemos alterar a entrada. Veja a resposta aceita. A solução permitiu que a entrada não fosse alterada, mas forneceu a saída desejada.
Bobby Cannon