Eliminar caracteres no alfanuméricos de la cadena

224

Quiero convertir la siguiente cadena a la salida proporcionada.

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

No he encontrado ninguna solución que maneje caracteres especiales como \r,\n , \b, etc.

Básicamente solo quiero deshacerme de cualquier cosa que no sea alfanumérica. Esto es lo que he intentado ...

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"

Otro intento con múltiples pasos

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

con resultados

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

Cualquier ayuda sería apreciada.

Solución de trabajo:

Final Attempt 1: return JSON.stringify("\\test\red\bob\fred\new").replace( /\W/g , '');
Output 1: "testredbobfrednew"
Bobby Cannon
fuente
Una pregunta interesante, el \ n en \ nuevo es claramente lo que está haciendo que esto ocurra. No estoy completamente seguro de cómo encontrarlo y reemplazarlo, aunque va en busca de expresiones regulares en caracteres especiales de espacio en blanco
Will Buck
1
¿Se escapan las entradas / cómo se asignan? var Input = "\\test\red\bob\fred\new"esta cadena no contiene "rojo", por lo que su primer intento es correcto, ¿está probando contra el litoral "\\\\test\\red\\bob\\fred\\new"?
Alex K.
/[^\w\s]+/giprueba esto.
Bartosz Grzybowski
Supongo que la pregunta es, ¿las barras invertidas en la cadena de entrada representan caracteres especiales? (Según su salida de ejemplo, supongo que no.)
Dave
¿Intentó cambiar de comillas dobles a comillas simples?
OptimusCrime

Respuestas:

468

Eliminar caracteres no alfanuméricos

La siguiente es la expresión regular correcta / a para quitar caracteres no alfanuméricos de una cadena de entrada:

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

Tenga en cuenta que \Wes el equivalente de [^0-9a-zA-Z_]: incluye el carácter de subrayado. Para eliminar también los guiones bajos, por ejemplo:

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

La entrada está mal formada

Dado que la cadena de prueba contiene varios caracteres escapados, que no son alfanuméricos, los eliminará.

Una barra invertida en la cadena necesita escapar si se toma literalmente:

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

Manejo de cuerdas malformadas

Si no puede escapar de la cadena de entrada correctamente (¿por qué no?), O si proviene de algún tipo de fuente no confiable / mal configurada, puede hacer algo como esto:

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

Tenga en cuenta que la representación json de una cadena incluye las comillas:

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

Pero también son eliminados por la expresión regular de reemplazo.

AD7six
fuente
10
Esto no elimina los guiones bajos.
kylex
44
@kylex, eso se debe a que los guiones bajos se consideran parte del grupo alfanumérico, por alguna razón
Eugene Kuzmenko
12
"Porque son los caracteres típicamente legales en los identificadores de variables". . No hay "_" en la pregunta, por supuesto, reemplazar \Wcon [_\W](que se usa en la pregunta) o similar eliminaría los guiones bajos.
AD7six
1
@ AD7six, ¿podría explicar por qué uno debería usar JSON.stringify () cuando la cadena proviene de una fuente no confiable? ¿Hay alguna preocupación de seguridad para no hacerlo? ¡Gracias!
jbmusso
1
@ guithor No es que "uno deba", o que afecte la seguridad en absoluto; Si se recibe "alguna cadena" y, por alguna razón, está básicamente descorchada (no se desprende de la pregunta de por qué la cadena se recibe mal formada), permite ver la cadena por lo que es: jsfiddle.net/Z6N7C
AD7six
49

Todas las respuestas actuales todavía tienen peculiaridades, lo mejor que se me ocurrió fue:

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

Aquí hay un ejemplo que captura cada tecla que pude encontrar en el teclado:

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

Salidas: '123abcABC'

Deminetix
fuente
1
input.replace(/\W/g, '')deja en el _en una cadena. @Deminetix tiene razón, string.replace(/[^A-Za-z0-9]/g, '');funciona mejor ya que elimina todos los caracteres no alfanuméricos de la cadena.
Tim
1
Y, sin embargo, ninguna permutación de esta respuesta responde realmente a la pregunta formulada .
AD7six
10

El problema no es cómo reemplaza los caracteres, sino cómo ingresa la cadena.

Es sólo la primera barra invertida en la entrada que es una barra invertida, los otros son parte de los caracteres de control \r, \b, \fy \n.

Como esas barras invertidas no son caracteres separados, sino parte de la notación para escribir un solo carácter de control, no se pueden eliminar por separado. Es decir, no puede eliminar la barra diagonal inversa \nya que no son dos caracteres separados, es la forma en que escribe el carácter de control LFo el salto de línea .

Si desea convertir esa entrada en la salida deseada, necesitará reemplazar cada carácter de control con la letra correspondiente, por ejemplo, reemplazar el carácter \ncon el caráctern .

Para reemplazar un carácter de control, debe usar un conjunto de caracteres como [\r], ya que \rtiene un significado especial en una expresión 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, '');

Demostración: http://jsfiddle.net/SAp4W/

Guffa
fuente
Entiendo todo lo que está diciendo, pero la pregunta sigue en pie y nadie ha sugerido la respuesta correcta todavía. La entrada puede ser cambios, pero nadie ha sugerido una respuesta sobre cómo cambiarla programáticamente en JS.
Bobby Cannon
2
@BobbyCannon: agregué código que toma su entrada exacta y produce la salida deseada.
Guffa
5

puedes probar esta expresión regular:

value.replace(/[\W_-]/g, '');
myrcutio
fuente
según la pregunta: solo quiero deshacerme de todo lo que no sea alfanumérico. ¿Qué resultado esperabas?
myrcutio
0

Esto elimina todos los caracteres no alfanuméricos, conserva las mayúsculas y los espacios entre las palabras.

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
fuente
Eso no funciona (lea la pregunta): también es una forma bastante compleja de hacer las cosas.
AD7six
1
@ AD7six gracias por señalar mi error. Cuando copio y pego la entrada en WebStrom, agrega automáticamente 2 barras invertidas adicionales a cada barra invertida existente. No pude notar esto. input = "\\ test \ red \ bob \ fred \ new" -> copy_paste = "\\\\ test \\ red \\ bob \\ fred \\ new".
Flavio
-1

Aquí hay un ejemplo que puedes usar,

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

removeNonAplhaNumeric("0_0 (: /-\ :) 0-0");
ravi kishore
fuente
-3

Si desea tener esta \\test\red\bob\fred\newcadena, debe escapar de todas las barras invertidas ( \). Cuando escribe \\test\\red\\bob\\fred\\newsu cadena en realidad contiene barras invertidas simples. Puede estar seguro de que esto imprimirá su cadena.
Entonces, si se escapan las barras invertidas en su cadena myString.replace(/\W/g,''), funcionará normalmente.

shift66
fuente
1
Si desea sugerir "debe escapar de todas las barras diagonales inversas ()", entonces debe proporcionar un ejemplo sobre cómo hacerlo.
Bobby Cannon
¿Qué crees que son barras invertidas dobles? y lo que quiero decir con "Cuando escribes \\ test \\ red \\ bob \\ fred \\ new tu cadena realmente contiene barras invertidas simples". ??? ¿Esto no explica?
shift66
La entrada es "\\ test \ red \ bod \ fred \ new" y no puede cambiar. Necesito una solución para esa cadena de entrada. Si quieres mostrarme cómo "escapar de las barras invertidas", entonces da un ejemplo. No podemos cambiar la entrada. Ver la respuesta aceptada. La solución permitió que la entrada no cambiara pero dio la salida deseada.
Bobby Cannon