2009-06-19 30 views
10

¿Cómo puedo eliminar todos los caracteres de una cadena que no son letras usando un RegEx de JavaScript?Cómo eliminar todos los caracteres de una cadena

+9

@RD - ¿Qué posible respuesta está esperando? No creo que sea mucho más simple que la respuesta de Paolo ... ¿Y qué "fuentes creíbles y/o oficiales"? Eso no tiene ningún sentido ... – Kobi

+1

un bounty no es un botón de "hacer código probado para mí". – AlfredoVR

Respuesta

57

Puede utilizar el replace método:

'Hey! The #123 sure is fun!'.replace(/[^A-Za-z]+/g, ''); 
>>> "HeyThesureisfun" 

Si quería mantener espacios:

'Hey! The #123 sure is fun!'.replace(/[^A-Za-z\s]+/g, ''); 
>>> "Hey The sure is fun" 

La expresión regular /[^a-z\s]/gi está diciendo básicamente para que coincida con cualquier cosa que no la az carta o un espacio (\ s), al hacer esto globalmente (la bandera g) e ignorar el caso de la cadena (la bandera i).

+0

Acabo de comprobarlo en la consola y funcionó muy bien. Me pregunto si él quería mantener espacios. – Nosredna

+10

+1 Pero usaría el equivalente un poco más eficiente: 'replace (/ [^ A-Za-z \ s] +/g, '');' Esto coincidirá con más de un carácter en cada "trago", y el modo sensible a mayúsculas y minúsculas puede ser ligeramente más rápido con algunos motores de expresiones regulares. – ridgerunner

+0

Tenga en cuenta que esto también eliminará los caracteres acentuados, que en mi opinión son letras. – rds

10

RegEx propiedades de la instancia utilizan g, i

mundial: Ya sea para probar la expresión regular con todos los partidos posibles en una cadena, o sólo contra el primero.

ignoreCase: Si se ignora el caso al intentar una coincidencia en una cadena.

RegEx caracteres especiales utilizados [a-z], +

[^ xyz]: Un conjunto de caracteres negada o complementada. Es decir, coincide con cualquier cosa que no esté entre corchetes. Puede especificar un rango de caracteres usando un guion.

Por ejemplo, [abcd] es lo mismo que [a-d]. Coinciden con la 'b' en "falda" y la 'c' en "cortar".

+: Combina el elemento anterior 1 o más veces. Equivalente a {1,}.

JavaScript string replace método sintaxis

str.replace (regexp | substr, newSubStr | [banderas, no estándar] función);

Las banderas no estándar g & i se pueden pasar en la sintaxis reemplazar o integrados en la expresión regular. ejemplos:

var re = /[^a-z]+/gi; var str = "this is a string"; var newstr = str.replace(re, ""); print(newstr); 

var str = "this is a string"; var newstr = str.replace(/[^a-z]+/, "", "gi"); print(newstr); 

para que coincida con los espacios en blanco, así \ s se añadirían a la expresión regular [^a-z\s]+.

JavaScript Reference

+0

Los indicadores están en el estándar ECMAScript. Pero el tercer argumento (flags) de 'String.prototype.replace' \t es [JavaScript-proprietary] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/replace). Evite a favor de banderas en el primer argumento (RegExp). – PointedEars

8

expresiones regulares en ECMAScript implementaciones están en mi humilde opinión explican mejor en la Mozilla Developer Network (formerly, Mozilla Developer Center) en el RegExp article del JavaScript Language Reference pp.

Sin embargo, como se ha señalado, las respuestas anteriores no toman cartas-Inglés no en cuenta, como diéresis y letras acentuadas.Con el fin de no quitar las cartas de la cadena, hay que excluirlos del rango de caracteres, así:

var s = "Victor 1 jagt 2 zwölf 3 Boxkämpfer 4 quer 5 über 6 den 7 Sylter 8 Deich"; 

s = s.replace(/[^a-zäöüß]+/gi, ""); 

Este enfoque se convierte rápidamente en tedioso y difícil de mantener, especialmente si varios lenguas naturales tienen que ser considerado (e incluso en inglés apropiado hay palabras extranjeras como "déjà vu" y "fiancé").

Por lo tanto, entre otras características PCRE, JSX:regexp.js le permite usar expresiones regulares que pueden usar clases de propiedad Unicode, a través del Unicode Character Database (UCD).

A continuación, write¹

var s = "Victor 1 jagt 2 zwölf 3 Boxkämpfer 4 quer 5 über 6 den 7 Sylter 8 Deich"; 

var rxNotLetter = new jsx.regexp.RegExp("\\P{Ll}+", "gi"); 

s = s.replace(rxNotLetter, ""); 

o

var s = "El 1 veloz 2 murciélago 3 hindú 4 comía 5 feliz 6 cardillo 7 y 8 kiwi. La cigüeña tocaba el saxofón detrás del palenque de paja" 
     + " – Съешь 1 же 2 ещё 3 этих 4 мягких 5 французских 6 булок, да 7 выпей 8 чаю."; 

var rxNotLetterOrWhitespace = new jsx.regexp.RegExp("[^\\p{Ll}\\p{Lu}\\s]+", "g"); 

s = s.replace(rxNotLetterOrWhitespace, ""); 

a reducir la dependencia de las peculiaridades mayúsculas/minúsculas de implementaciones (y ser más extensible), para un RegExp que excluye a todos los no-carta Caracteres Unicode (y espacio en blanco en el segundo ejemplo).

Testcase

Asegúrese de proporcionar una versión de la base de datos de caracteres Unicode, así, ya que es grande, en proceso de cambio, y por lo tanto no integrado en regexp.js (JSX contiene un texto detallado y la versión compactada de la escritura el UCD; ambos pueden ser utilizados, y el último es preferido, por regexp.js). Tenga en cuenta que a conforming ECMAScript implementation does not need to support characters beyond the Basic Multilingual Plane (U+0000 to U+FFFF), por lo que jsx.regexp.RegExp actualmente no puede admitir aquellos a pesar de que están en el UCD. Consulte la documentación en el código fuente para más detalles.

¹ Pangrams de Wikipedia, la enciclopedia libre.

+2

Votación máxima. ¡Esto es imprescindible si hay personajes no ingleses! – SoonDead

Cuestiones relacionadas