Eliminar todos los caracteres especiales con RegExp

234

Me gustaría un RegExp que elimine todos los caracteres especiales de una cadena. Estoy intentando algo como esto pero no funciona en IE7, aunque funciona en Firefox.

var specialChars = "!@#$^&%*()+=-[]\/{}|:<>?,.";

for (var i = 0; i < specialChars.length; i++) {
  stringToReplace = stringToReplace.replace(new RegExp("\\" + specialChars[i], "gi"), "");
}

También sería útil una descripción detallada de RegExp.

Timothy Ruhle
fuente
18
Algo así sería mejor como una lista blanca, no como una lista negra. entonces podrías simplemente hacer [az] | [0-9] | \ s
Ape-inago
Cualquier error de script? ¿Lo depuraste? O bien, pruebe ... bloque de captura en el código de JavaScript.
Kangkan
@ Ape-inago, ¿podría explicarme un poco más RegExp
Timothy Ruhle, el
3
¡Defina "carácter especial"! ¿Es "風" especial para ti? (Pensando en esto, verás el punto de @ Ape-iango.)
deceze
77
No creo que nadie aquí haya querido ofender. Me quemé antes haciéndolo como una lista negra ya que siempre hay esos pequeños "trucos" que terminan llegando (como los ejemplos de deceze). En última instancia, el enfoque correcto es más sobre por qué está tratando de hacer esto.
Ape-inago

Respuestas:

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

Como se mencionó en los comentarios, es más fácil hacer esto como una lista blanca: reemplace los caracteres que no están en su lista segura.

El carácter caret ( ^) es la negación del conjunto [...], gidigamos global y no distingue entre mayúsculas y minúsculas (este último es un poco redundante pero quería mencionarlo) y la lista segura en este ejemplo es dígitos, caracteres de palabras, guiones bajos ( \w) y espacios en blanco ( \s)

annakata
fuente
50
Esta solución no funciona para símbolos que no están en inglés. "Їжак" por ejemplo.
Gaviota
44
También puede usar mayúsculas \ W en lugar de ^ \ w. \ W: coincide con cualquier carácter que no sea de palabra. Equivalente a [^ A-Za-z0-9_]. developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…
delkant
@ Gaviota He agregado una respuesta que maneja Unicodes.
freedev
1
para aceptar palabras acentuadas, como en portugués, haga esto: stringToReplace.replace (/ [^ A-zÀ-ú \ s] / gi, '')
alansiqueira27
1
Para agregar la mayoría de los idiomas europeos (noruego, sueco, alemán, portugués, español) stringToReplace.replace (/ [^ \ w \ s \ xc0-xff] / gi, ''). Para incluir otros idiomas, se pueden usar rangos unicode. Ver: stackoverflow.com/questions/150033/…
Eskil Mjelva Saatvedt
105

Tenga en cuenta que si aún desea excluir un conjunto, incluidas barras y caracteres especiales, puede hacer lo siguiente:

var outString = sourceString.replace(/[`~!@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, '');

tome nota especial de que para incluir también el carácter "menos", debe escapar con una barra diagonal inversa como el último grupo. si no lo hace, también seleccionará 0-9, que probablemente no sea deseado.

sin entrada
fuente
10
excelente solución! la respuesta aceptada solo funciona en inglés, esto funciona en cualquier idioma (hasta donde he verificado). gracias :)
Ronen Ness
1
@knutole quita la parte ?del juego de caracteres hacia el frente. esto enumera los caracteres que desea eliminar, por lo que excluirlo de ser despojado lo incluirá inherentemente en el resultado final.
noinput
Esto funciona muy bien, se adapta perfectamente a cualquier idioma, solo necesita agregar el carácter que desea reemplazar y eso es todo. Gracias.
Elros Romeo
21

La expresión regular Javascript simple no maneja letras Unicode .

No lo use [^\w\s], esto eliminará letras con acentos (como àèéìòù), sin mencionar al cirílico o chino, las letras que provienen de dichos idiomas se eliminarán por completo.

Realmente no desea eliminar estas letras junto con todos los caracteres especiales. Tienes dos posibilidades:

  • Añadir en su expresión regular todos los caracteres especiales que no desea quitar,
    por ejemplo: [^èéòàùì\w\s].
  • Echa un vistazo a xregexp.com . XRegExp agrega soporte básico para la coincidencia Unicode a través de la \p{...}sintaxis.

var str = "Їжак::: résd,$%& adùf"
var search = XRegExp('([^?<first>\\pL ]+)');
var res = XRegExp.replace(str, search, '',"all");

console.log(res); // returns "Їжак::: resd,adf"
console.log(str.replace(/[^\w\s]/gi, '') ); // returns " rsd adf"
console.log(str.replace(/[^\wèéòàùì\s]/gi, '') ); // returns " résd adùf"
<script src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/3.1.1/xregexp-all.js"></script>

freedev
fuente
3
Es bueno saberlo para la internacionalización, no tenía idea de que JS regex no tuviera mentalidad UTF-8.
LessQuesar
No puede poner todas las letras UTF-8 válidas en var str
Gaviota el
@Seagull sí, pero en caso de que no esté escribiendo una aplicación compatible con todo el mundo, puede poner pragmáticamente solo la lista de letras UTF-8 válidas para sus localizaciones actuales. En mi caso, para el idioma italiano solo hay unas pocas letras.
freedev
7

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 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 funciona solo 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 intenta eliminar caracteres especiales para implementar la funcionalidad de búsqueda, existe un mejor enfoque. Utilice cualquier biblioteca de transliteración que produzca su cadena solo de caracteres latinos y luego el Regexp simple 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
Excelente, como esta respuesta! Lo uso para crear un nombre de archivo válido y ampliar su solución para eliminar espacios (compatible con Linux / Unix) y permitir números también. Entonces extendí la declaración if (jQuery involucrado): if (str [i]! == '' && (lower [i]! = Upper [i] || lower [i] .trim () === '' | | $ .isNumeric (str [i])))
Jonny
en muchos idiomas no hay letras mayúsculas ... por lo tanto, la función considerará la entrada válida como caracteres especiales
Yair Levy
Los caracteres chinos son un ejemplo que se despoja de esto
lethek el
Cuando creé esta solución, desafortunadamente, no estaba pensando en idiomas como el chino. La solución tiene que ser propuesta, ya que las respuestas anteriores tampoco funcionarán.
Gaviota
1

Uso RegexBuddy para depurar mis expresiones regulares, tiene casi todos los idiomas muy útiles. Que copiar / pegar para el idioma de destino. Herramienta fabulosa y no muy cara.

Así que copié / pegué su expresión regular y su problema es que [,] son ​​caracteres especiales en la expresión regular, por lo que debe escapar de ellos. Entonces la expresión regular debe ser: /!@#$^&%*()+=-[\x5B\x5Dfont>\/{}|:<>?,./im

millebii
fuente
0

¿Por qué no haces algo como:

re = /^[a-z0-9 ]$/i;
var isValid = re.test(yourInput);

para verificar si su entrada contiene algún carácter especial

Y
fuente
17
El OP dice que está tratando de eliminar caracteres especiales para no ver si existen.
annakata
Esta es una buena solución, pero solo permitirá números de letras del alfabeto inglés y el espacio, pero eliminará caracteres como èéòàùìy, en algunos casos, esta no será la solución
Mapmalith
0

str.replace(/\s|[0-9_]|\W|[#$%^&*()]/g, "")Hice algo así. Pero hay algunas personas que lo hicieron mucho más fácil comostr.replace(/\W_/g,"");

Eldar Mammadov
fuente
La mayoría de las cosas en su enfoque son redundantes, ya que \Wcontiene algunos de los caracteres. ¿Pero por qué filtrarías los números? Esos no son personajes especiales.
user4642212