Actualmente, este es mi código.
function clean_string(raw_string) { A = "ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 1234567890".split( "" ); var cleaned_string = raw_string.toLowerCase(); for (i = 0; i < cleaned_string.length; i++) { if (!A.includes(cleaned_string[i])) { cleaned_string = setCharAt(cleaned_string, i, " "); } } cleaned_string = cleaned_string.replace(/\s\s+/g, " "); return cleaned_string; } function setCharAt(str, index, chr) { if (index > str.length - 1) return str; return str.substring(0, index) + chr + str.substring(index + 1); }No sé expresiones regulares y probablemente será más fácil con expresiones regulares. Esto es lo que quiero hacer:
Entrada: Hello, David World 123!
Salida: hello david world 123
.
Entrada: hELlo., <>;dAVId world .;- 123
Salida: hello david world 123
.
Entrada: He.llo David, w!orld 123#
Salida: he llo david w orld 123
.
Básicamente, lo que quiero hacer es reemplazar cualquier cosa menos a-z0-9 con un espacio y luego eliminar los espacios dobles. En otras palabras, solo quiero a-z0-9 en mis resultados. ¿Cómo puedo hacer eso?
PD: el código funciona, pero creo que se ve mal y es bastante ineficiente.
EDITAR: Lo siento, quise decir que solo quiero letras minúsculas en mi salida. Soy tonto.
Una solución simple sería convertir todos los caracteres a minúsculas, reemplazar cualquier carácter que no sea az, 0-9 o un espacio con un carácter de espacio y luego reemplazar varios caracteres de espacio con un solo carácter de espacio.
function sanitize(input) { return input .toLowerCase() .replace(/([^az\d\s]+)/g, ' ') .replace(/(\s+)/g, ' '); } console.log(sanitize('Hello, David World 123!')); console.log(sanitize('hELlo., <>;dAVId world .;- 123')); console.log(sanitize('He.llo David, w!orld 123#'));Aquí hay un enfoque que usa una devolución de llamada de expresiones regulares:
var inputs = ["Hello, David World 123!", "hELlo., <>;dAVId world .;- 123", "He.llo David, w!orld 123#"]; for (var i=0; i < inputs.length; ++i) { var input = inputs[i]; input = input.replace(/\w+/g, x => x.toLowerCase()) .replace(/[^\w_]+/g, " "); console.log(input); }La estrategia aquí es hacer dos reemplazos de expresiones regulares. El primero encuentra todas las palabras en la entrada y las convierte a minúsculas. Luego, el segundo elimina todos los caracteres que no son palabras y los espacios en blanco, incluido el guión bajo, y los reemplaza con un solo espacio.
Una expresión regular simple para reemplazar caracteres no alfanuméricos, luego otra para eliminar más de un espacio seguido debería ser suficiente.
const clean = (input) => { const alphanumeric = input.replace(/[^a-zA-Z0-9]/g, ' ') const spaceless = alphanumeric.replace(/\s{2,}/g, ' ') console.log(spaceless.toLowerCase()) return spaceless.toLowerCase() } clean("Hello, David World 123!") clean("hELlo., <>;dAVId world .;- 123") clean("He.llo David, w!orld 123# ")Por supuesto, la función se puede acortar a
const clean = (input) => { return input.replace(/[^a-zA-Z0-9]/g, ' '). replace(/\s{2,}/g, ' '). toLowerCase() }Explicación de expresiones regulares :
[^a-zA-Z0-9] : Coincide con cualquier cosa que no coincida con a-zA-Z0-9 (cualquier cosa no alfanumérica) \s{2,} : Coincide con un espacio que aparece dos o más veces seguidas
Puede usar una sola llamada de reemplazo, ya sea en minúsculas solo caracteres en mayúsculas, o reemplazar 1 o más caracteres que no sean palabras con un solo espacio.
Para diferenciar entre el reemplazo y las minúsculas, puede usar un grupo de captura en la expresión regular y buscar ese grupo en la función de devolución de llamada.
Si coincide con el grupo 1, entonces hay 1 o más caracteres en mayúscula AZ.
[ "Hello, David World 123!", "hELlo., <>;dAVId world .;- 123", "He.llo David, w!orld 123#" ].forEach(s => console.log( s.replace(/([AZ]+)|[^\w_]+/g, (_, g1) => g1 ? g1.toLowerCase() : ' ') ) )