Respostas:
string s = "søme string";
s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty);
Aqui está uma solução .NET pura que não usa expressões 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)
)
);
Pode parecer complicado, mas deve ser intuitivo. Ele usa a codificação .NET ASCII para converter uma string. O UTF8 é usado durante a conversão porque pode representar qualquer um dos caracteres originais. Ele usa um EncoderReplacementFallback para converter qualquer caractere não ASCII em uma sequência vazia.
Acredito que MonsCamus quis dizer:
parsememo = Regex.Replace(parsememo, @"[^\u0020-\u007E]", string.Empty);
Se você não deseja despir, mas realmente converter caracteres acentuados em latim em caracteres não acentuados, dê uma olhada nesta pergunta: Como converter caracteres de 8 bits em caracteres de 7 bits? (ie Ü a U)
Inspirado na solução Expression Regular da philcruz, criei uma solução LINQ pura
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 é um código não testado.
return new string( source.Where( c => c >= min && c <= max ).ToArray() );
não há necessidade de regex. basta usar codificação ...
sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput));
????nacho??
quando tentei: たまねこnachoなち
no mono 3.4
Eu achei o seguinte intervalo ligeiramente alterado útil para analisar blocos de comentários em um banco de dados, isso significa que você não precisará lidar com caracteres de tabulação e escape, o que causaria transtorno a um campo CSV.
parsememo = Regex.Replace(parsememo, @"[^\u001F-\u007F]", string.Empty);
Se você deseja evitar outros caracteres especiais ou pontuação específica, verifique a tabela ascii
Eu vim aqui procurando uma solução para caracteres ASCII estendidos, mas não consegui encontrá-la. O mais próximo que encontrei é a solução da bzlm . Mas isso funciona apenas para o código ASCII até 127 (obviamente, você pode substituir o tipo de codificação no código dele, mas acho que era um pouco complexo de entender. Por isso, compartilhando esta versão). Aqui está uma solução que funciona para códigos ASCII estendidos, ou seja, até 255, que é o ISO 8859-1
Encontra e remove caracteres não-ascii (maiores que 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:
Aqui está um violino de trabalho para o código
Substitua a codificação conforme o requisito, o restante deve permanecer o mesmo.
Isso não é ideal em termos de desempenho, mas uma abordagem bastante direta do Linq:
string strippedString = new string(
yourString.Where(c => c <= sbyte.MaxValue).ToArray()
);
A desvantagem é que todos os caracteres "sobreviventes" são primeiro colocados em uma matriz do tipo char[]
que é descartada depois que o string
construtor não o usa mais.
Eu usei esta expressão regex:
string s = "søme string";
Regex regex = new Regex(@"[^a-zA-Z0-9\s]", (RegexOptions)0);
return regex.Replace(s, "");
Eu uso essa expressão regular para filtrar caracteres inválidos em um nome de arquivo.
Regex.Replace(directory, "[^a-zA-Z0-9\\:_\- ]", "")
Devem ser todos os caracteres permitidos para nomes de arquivos.