Respuestas:
string s = "søme string";
s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty);
Aquí hay una solución .NET pura que no usa expresiones regulares:
string inputString = "Räksmörgås";
string asAscii = Encoding.ASCII.GetString(
Encoding.Convert(
Encoding.UTF8,
Encoding.GetEncoding(
Encoding.ASCII.EncodingName,
new EncoderReplacementFallback(string.Empty),
new DecoderExceptionFallback()
),
Encoding.UTF8.GetBytes(inputString)
)
);
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.
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)
Inspirado por la solución de expresión regular de philcruz , he creado una solución pura de LINQ
public static string PureAscii(this string source, char nil = ' ')
{
var min = '\u0000';
var max = '\u007F';
return source.Select(c => c < min ? nil : c > max ? nil : c).ToText();
}
public static string ToText(this IEnumerable<char> source)
{
var buffer = new StringBuilder();
foreach (var c in source)
buffer.Append(c);
return buffer.ToString();
}
Este es un código no probado.
return new string( source.Where( c => c >= min && c <= max ).ToArray() );
No hay necesidad de expresiones regulares. solo usa la codificación ...
sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput));
????nacho??
cuando lo intenté: たまねこnachoなち
en mono 3.4
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.
parsememo = Regex.Replace(parsememo, @"[^\u001F-\u007F]", string.Empty);
Si desea evitar otros caracteres especiales o signos de puntuación particulares, consulte la tabla ASCII
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 as String= "â, ??î or ôu🕧� n☁i✑💴++$-💯♓!🇪🚑🌚‼⁉4⃣od;/⏬'®;😁☕😁:☝)😁😁///😍1!@#"
Dim extendedAscii As Encoding = Encoding.GetEncoding("ISO-8859-1",
New EncoderReplacementFallback(String.empty),
New DecoderReplacementFallback())
Dim extendedAsciiBytes() As Byte = extendedAscii.GetBytes(str1)
Dim str2 As String = extendedAscii.GetString(extendedAsciiBytes)
console.WriteLine(str2)
'Output : â, ??î or ôu ni++$-!‼⁉4od;/';:)///1!@#$%^yz:
Aquí está un violín que funciona para el código
Reemplace la codificación según el requisito, el resto debe permanecer igual.
Este no es un rendimiento óptimo en cuanto a rendimiento, sino un enfoque bastante directo de Linq:
string strippedString = new string(
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 string
constructor ya no lo usa.
Usé esta expresión regular:
string s = "søme string";
Regex regex = new Regex(@"[^a-zA-Z0-9\s]", (RegexOptions)0);
return regex.Replace(s, "");
Utilizo esta expresión regular para filtrar los caracteres incorrectos en un nombre de archivo.
Regex.Replace(directory, "[^a-zA-Z0-9\\:_\- ]", "")
Deben ser todos los caracteres permitidos para los nombres de archivo.