Para aquellos de nosotros que RegEx había desafiado, ¿les importaría escribir en inglés su patrón RegEx? En otras palabras, "the ^ does this", etc ...
Metro Smurf
47
@Metro Smurf the ^ no es el operador. Le dice a la expresión regular que busque todo lo que no coincide, en lugar de todo lo que sí coincide. El \ u #### - \ u #### dice qué caracteres coinciden. \ U0000- \ u007F es el equivalente de los primeros 255 caracteres en utf-8 o unicode, que siempre son los caracteres ascii. Entonces, coincide con todos los caracteres no ascii (debido a que no) y reemplaza todo lo que coincide.
Gordon Tucker
41
El rango para caracteres imprimibles es 0020-007E, para personas que buscan expresiones regulares para reemplazar caracteres no imprimibles
Mubashar
1
@GordonTucker \ u0000- \ u007F es el equivalente de los primeros 127 caracteres en utf-8 o unicode y NO los primeros 225. Ver tabla
full_prog_full
44
@full_prog_full Es por eso que me respondí a mí mismo un minuto después, corrigiéndome para decir que era 127 y no 255. :)
Gordon Tucker
125
Aquí hay una solución .NET pura que no usa expresiones regulares:
Puede parecer engorroso, pero debe ser intuitivo. Utiliza la codificación .NET ASCII para convertir una cadena. UTF8 se usa durante la conversión porque puede representar cualquiera de los caracteres originales. Utiliza un EncoderReplacementFallback para convertir cualquier carácter que no sea ASCII en una cadena vacía.
¡Perfecto! Estoy usando esto para limpiar una cadena antes de guardarla en un documento RTF. Muy apreciado. Mucho más fácil de entender que la versión Regex.
Nathan Prather
21
¿Realmente te resulta más fácil de entender? Para mí, todo lo que no es realmente relevante (retrocesos, conversiones a bytes, etc.) está alejando la atención de lo que realmente sucede.
bzlm
21
Es algo así como decir que los destornilladores son demasiado confusos, así que solo usaré un martillo.
Brandon
8
@Brandon, en realidad, esta técnica no hace el trabajo mejor que otras técnicas. Entonces, la analogía sería usar un destornillador viejo en lugar de un elegante iScrewDriver Deluxe 2000. :)
bzlm
10
Una ventaja es que puedo reemplazar fácilmente ASCII con ISO 8859-1 u otra codificación :)
Ni siquiera me di cuenta de que esto era posible, pero es una solución mucho mejor para mí. Voy a agregar este enlace a un comentario sobre la pregunta para que sea más fácil de encontrar para otras personas. ¡Gracias!
publicstaticstringPureAscii(thisstring source,char nil =' '){var min ='\u0000';var max ='\u007F';return source.Select(c => c < min ? nil : c > max ? nil : c).ToText();}publicstaticstringToText(thisIEnumerable<char> source){var buffer =newStringBuilder();foreach(var c in source)
buffer.Append(c);return buffer.ToString();}
Para aquellos que no lo entendieron, esta es una solución basada en LINQ C # 4.0. :)
77
En lugar del método separado ToText (), ¿qué tal reemplazar la línea 3 de PureAscii () con: return new string (source.Select (c => c <min? Nil: c> max? Nil: c) .ToArray ()) ;
agentnega
O tal vez ToText como: return (nueva cadena (fuente)). ToArray () - dependiendo de lo que funcione mejor. Todavía es bueno tener ToText como método de extensión: estilo fluido / de canalización. :-)
Bent Rasmussen
Ese código reemplaza los caracteres no ASCII con un espacio. Para eliminarlos, cambie Seleccionar a Dónde:return new string( source.Where( c => c >= min && c <= max ).ToArray() );
Foozinator
@Foozinator Ese código le permite especificar con qué carácter reemplazar los caracteres no ASCII. De manera predeterminada, utiliza un espacio, pero si se llama como .PureASCII (Char.MinValue), reemplazará todos los que no sean ASCII con '\ 0', lo que aún no los elimina exactamente, pero tiene resultados similares.
Ulfius
5
No hay necesidad de expresiones regulares. solo usa la codificación ...
Encontré que el siguiente rango ligeramente alterado es útil para analizar bloques de comentarios de una base de datos, esto significa que no tendrá que lidiar con tabuladores y caracteres de escape que causarían que un campo CSV se altere.
En caso de que alguien no haya notado los otros comentarios, los caracteres imprimibles son en realidad @ "[^ \ u0020- \ u007E]". Aquí tiene un enlace para ver la tabla si tiene curiosidad: asciitable.com
scradam
3
Vine aquí buscando una solución para caracteres ascii extendidos, pero no pude encontrarla. Lo más cercano que encontré es la solución de bzlm . Pero eso funciona solo para el código ASCII hasta 127 (obviamente, puede reemplazar el tipo de codificación en su código, pero creo que fue un poco complejo de entender. Por lo tanto, compartir esta versión). Aquí hay una solución que funciona para códigos ASCII extendidos, es decir, hasta 255, que es la ISO 8859-1
Encuentra y elimina caracteres no ascii (mayores de 255)
Dim str1 asString="â, ??î or ôu🕧� n☁i✑💴++$-💯♓!🇪🚑🌚‼⁉4⃣od;/⏬'®;😁☕😁:☝)😁😁///😍1!@#"Dim extendedAscii AsEncoding=Encoding.GetEncoding("ISO-8859-1",NewEncoderReplacementFallback(String.empty),NewDecoderReplacementFallback())Dim extendedAsciiBytes()AsByte= extendedAscii.GetBytes(str1)Dim str2 AsString= extendedAscii.GetString(extendedAsciiBytes)
console.WriteLine(str2)'Output : â, ??î or ôu ni++$-!‼⁉4od;/';:)///1!@#$%^yz:
El único que funcionó para eliminar SOLO el Ω de esta cadena "Ω c ç ã". ¡Muchas gracias!
Rafael Araújo
2
Este no es un rendimiento óptimo en cuanto a rendimiento, sino un enfoque bastante directo de Linq:
string strippedString =newstring(
yourString.Where(c => c <=sbyte.MaxValue).ToArray());
La desventaja es que todos los caracteres "supervivientes" se colocan primero en una matriz de tipo char[]que luego se desecha después de que el stringconstructor ya no lo usa.
Respuestas:
fuente
Aquí hay una solución .NET pura que no usa expresiones regulares:
Puede parecer engorroso, pero debe ser intuitivo. Utiliza la codificación .NET ASCII para convertir una cadena. UTF8 se usa durante la conversión porque puede representar cualquiera de los caracteres originales. Utiliza un EncoderReplacementFallback para convertir cualquier carácter que no sea ASCII en una cadena vacía.
fuente
Creo que MonsCamus quería decir:
fuente
Si no desea eliminar, sino convertir los caracteres latinos con acento en caracteres sin acento, eche un vistazo a esta pregunta: ¿Cómo traduzco caracteres de 8 bits en caracteres de 7 bits? (es decir, de Ü a U)
fuente
Inspirado por la solución de expresión regular de philcruz , he creado una solución pura de LINQ
Este es un código no probado.
fuente
return new string( source.Where( c => c >= min && c <= max ).ToArray() );
No hay necesidad de expresiones regulares. solo usa la codificación ...
fuente
????nacho??
cuando lo intenté:たまねこnachoなち
en mono 3.4Encontré que el siguiente rango ligeramente alterado es útil para analizar bloques de comentarios de una base de datos, esto significa que no tendrá que lidiar con tabuladores y caracteres de escape que causarían que un campo CSV se altere.
Si desea evitar otros caracteres especiales o signos de puntuación particulares, consulte la tabla ASCII
fuente
Vine aquí buscando una solución para caracteres ascii extendidos, pero no pude encontrarla. Lo más cercano que encontré es la solución de bzlm . Pero eso funciona solo para el código ASCII hasta 127 (obviamente, puede reemplazar el tipo de codificación en su código, pero creo que fue un poco complejo de entender. Por lo tanto, compartir esta versión). Aquí hay una solución que funciona para códigos ASCII extendidos, es decir, hasta 255, que es la ISO 8859-1
Encuentra y elimina caracteres no ascii (mayores de 255)
Aquí está un violín que funciona para el código
Reemplace la codificación según el requisito, el resto debe permanecer igual.
fuente
Este no es un rendimiento óptimo en cuanto a rendimiento, sino un enfoque bastante directo de Linq:
La desventaja es que todos los caracteres "supervivientes" se colocan primero en una matriz de tipo
char[]
que luego se desecha después de que elstring
constructor ya no lo usa.fuente
Usé esta expresión regular:
fuente
Utilizo esta expresión regular para filtrar los caracteres incorrectos en un nombre de archivo.
Deben ser todos los caracteres permitidos para los nombres de archivo.
fuente