Elimine todos los caracteres especiales excepto el espacio de una cadena usando JavaScript

157

Quiero eliminar todos los caracteres especiales excepto el espacio de una cadena usando JavaScript.

Por ejemplo, abc's test#s debería salir como abcs tests.

nithi
fuente
3
¿Cómo se define el carácter especial?
Keith Irwin el

Respuestas:

349

Debe usar la función de reemplazo de cadena, con una sola expresión regular. Asumiendo por caracteres especiales, quieres decir cualquier cosa que no sea letra, aquí hay una solución:

const str = "abc's test#s";
console.log(str.replace(/[^a-zA-Z ]/g, ""));

Petar Ivanov
fuente
55
Para utilizar esta solución en alfabeto no latino por favor revise esta respuesta fuera
Efkan
¡Esto también eliminará caracteres numéricos!
tech_geek
15
@tech_geek que puedes hacerstr.replace(/[^a-zA-Z0-9]/g, "")
Chidi Williams
2
En realidad necesitas este str.replace(/[^a-zA-Z0-9 ]/g, "");aviso, hay un espacio entre 0-9 y]
Ammar Shah
Necesita algunos ajustes, no eliminó / o - los caracteres y se supone que el primer carácter de camelCase está en minúsculas, pero este en mayúsculas.
Sansun
133

Puede hacerlo especificando los caracteres que desea eliminar:

string = string.replace(/[&\/\\#,+()$~%.'":*?<>{}]/g, '');

Alternativamente, para cambiar todos los caracteres excepto números y letras, intente:

string = string.replace(/[^a-zA-Z0-9]/g, '');
Lakshmana Kumar D
fuente
44
¿Qué pasa si no quiero eliminar el espacio con esto? /[^a-zA-Z0-9]/g
aadi1295
8
@ArbazAbid para mantener el espacio, solo agrégalo a los caracteres de la lista blanca. su expresión regular sería "/ [^ a-zA-Z0-9] / g" (observe el espacio en blanco después de 9)
Crhistian Ramirez
1
Esta fue la respuesta que funcionó, si se requiere un espacio.
Nathan
esto reemplaza ()y whitespacesen cadena.text().replace(/[ ()]/g, '')
C Alonso C Ortega
30

La primera solución no funciona para ningún alfabeto UTF-8. (Cortará texto como Привіт). He logrado crear una función que no utiliza RegExp y utiliza un buen soporte UTF-8 en el motor de JavaScript. La idea es simple si un símbolo es igual en mayúsculas y minúsculas, es un carácter especial. La única excepción se hace para los espacios en blanco.

function removeSpecials(str) {
    var lower = str.toLowerCase();
    var upper = str.toUpperCase();

    var res = "";
    for(var i=0; i<lower.length; ++i) {
        if(lower[i] != upper[i] || lower[i].trim() === '')
            res += str[i];
    }
    return res;
}

Actualización: Tenga en cuenta que esta solución solo funciona para idiomas donde hay letras minúsculas y mayúsculas. En idiomas como el chino, esto no funcionará.

Actualización 2: llegué a la solución original cuando estaba trabajando en una búsqueda difusa. Si también está tratando de eliminar caracteres especiales para implementar la funcionalidad de búsqueda, existe un mejor enfoque. Use cualquier biblioteca de transliteración que produzca su cadena solo de caracteres latinos y luego el simple Regexp hará toda la magia de eliminar caracteres especiales. (Esto también funcionará para los chinos y también recibirá beneficios secundarios al hacer Tromsø== Tromso).

Gaviota
fuente
Gracias por esta solución bastante creativa. Está mucho más en línea con el funcionamiento de los idiomas, ya que muchos de nosotros no consideramos caracteres especiales "Привіт" o "æøå". La mayoría de las soluciones por ahí cortan cualquier carácter que no sea parte del alfabeto inglés.
Alex Langberg
1
Casi la respuesta perfecta para mí, pero desafortunadamente considera que los caracteres chinos son caracteres especiales.
Eric Majerus
@EricMajerus y también hindi
programador
Tenga cuidado, esto también considera los números como caracteres especiales.
just_user
11

No conozco JavaScript, pero ¿no es posible usar regex?

Algo así [^\w\d\s]coincidirá con cualquier cosa menos dígitos, caracteres y espacios en blanco. Sería solo una pregunta para encontrar la sintaxis en JavaScript.

Thiago Moraes
fuente
1
stackoverflow.com/a/4374890/2384606 Esta es la respuesta a tu pregunta :)
Carmela
8

Probé la solución muy creativa de Seagul, pero descubrí que trataba los números también como caracteres especiales, lo que no se ajustaba a mis necesidades. Así que aquí está mi ajuste (a prueba de fallos) de la solución de Seagul ...

//return true if char is a number
function isNumber (text) {
  if(text) {
    var reg = new RegExp('[0-9]+$');
    return reg.test(text);
  }
  return false;
}

function removeSpecial (text) {
  if(text) {
    var lower = text.toLowerCase();
    var upper = text.toUpperCase();
    var result = "";
    for(var i=0; i<lower.length; ++i) {
      if(isNumber(text[i]) || (lower[i] != upper[i]) || (lower[i].trim() === '')) {
        result += text[i];
      }
    }
    return result;
  }
  return '';
}
Mozfet
fuente
Olvidó declarar regen su primera función.
Noman Ali
6

buscar todos los no (caracteres de palabras || espacio):

str.replace(/[^\w ]/, '')
dovid
fuente
1

Intenta usar este

var result= stringToReplace.replace(/[^\w\s]/gi, '')

aquí ^ quilate es para negación \ w para caracteres de palabras [a-zA-Z0-9_] y \ s para espacio / [] / gi para global

Shrinivasan
fuente
0

El punto (.) no puede considerarse especial. He agregado una condición OR a la respuesta de Mozfet & Seagull:

function isNumber (text) {
      reg = new RegExp('[0-9]+$');
      if(text) {
        return reg.test(text);
      }
      return false;
    }

function removeSpecial (text) {
  if(text) {
    var lower = text.toLowerCase();
    var upper = text.toUpperCase();
    var result = "";
    for(var i=0; i<lower.length; ++i) {
      if(isNumber(text[i]) || (lower[i] != upper[i]) || (lower[i].trim() === '') || (lower[i].trim() === '.')) {
        result += text[i];
      }
    }
    return result;
  }
  return '';
}
hassanf1
fuente
0

const input = `#if_1 $(PR_CONTRACT_END_DATE) == '23-09-2019' # 
Test27919<alerts@imimobile.com> #elseif_1 $(PR_CONTRACT_START_DATE) ==  '20-09-2019' #
Sender539<rama.sns@gmail.com> #elseif_1 $(PR_ACCOUNT_ID) == '1234' #
AdestraSID<hello@imimobile.co> #else_1#Test27919<alerts@imimobile.com>#endif_1#`;
const replaceString = input.split('$(').join('->').split(')').join('<-');


console.log(replaceString.match(/(?<=->).*?(?=<-)/g));

nunna del sur
fuente
-11

Los caracteres especiales que desea eliminar de una cadena, prepare una lista de ellos y luego la función de reemplazo de JavaScript del usuario para eliminar todos los caracteres especiales.

var str = 'abc'de#;:sfjkewr47239847duifyh';
alert(str.replace("'","").replace("#","").replace(";","").replace(":",""));

o puede ejecutar el bucle para una cadena completa y comparar un solo carácter con el código ASCII y regenerar una nueva cadena.

Gaurav Agrawal
fuente
9
No, por favor no hagas eso. Es realmente terriblemente lento. Es mucho, mucho mejor usar una expresión regular.
Keith Irwin el
Esta solución es muy buena para reemplazar solo un personaje. En mi caso fue útil, gracias.
Vahid Najafi
En lugar de usar el método de reemplazo muchas veces, úselo solo una vez usando expresiones regulares.
FAISAL