Risposte:
string s = "søme string";
s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty);
Ecco una soluzione .NET pura che non utilizza espressioni regolari:
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)
)
);
Può sembrare ingombrante, ma dovrebbe essere intuitivo. Utilizza la codifica ASCII .NET per convertire una stringa. UTF8 viene utilizzato durante la conversione perché può rappresentare uno qualsiasi dei caratteri originali. Utilizza un EncoderReplacementFallback per convertire qualsiasi carattere non ASCII in una stringa vuota.
Se non vuoi spogliarti, ma convertire effettivamente i caratteri accentati latini in caratteri non accentati, dai un'occhiata a questa domanda: Come posso tradurre i caratteri a 8 bit in caratteri a 7 bit? (ovvero da Ü a U)
Ispirato alla soluzione Regular Expression di philcruz , ho realizzato una soluzione 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();
}
Questo è un codice non testato.
return new string( source.Where( c => c >= min && c <= max ).ToArray() );
non c'è bisogno di regex. basta usare la codifica ...
sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput));
????nacho??
quando ho provato: たまねこnachoなち
in mono 3.4
Ho trovato utile il seguente intervallo leggermente modificato per analizzare i blocchi di commenti fuori da un database, questo significa che non dovrete fare i conti con i caratteri tab e escape che provocherebbero il ribaltamento di un campo CSV.
parsememo = Regex.Replace(parsememo, @"[^\u001F-\u007F]", string.Empty);
Se vuoi evitare altri caratteri speciali o punteggiatura particolare controlla la tabella ASCII
Sono venuto qui alla ricerca di una soluzione per caratteri ASCII estesi, ma non sono riuscito a trovarlo. Il più vicino che ho trovato è la soluzione di bzlm . Ma questo funziona solo per il codice ASCII fino a 127 (ovviamente puoi sostituire il tipo di codifica nel suo codice, ma penso che sia stato un po 'complesso da capire. Quindi, condividere questa versione). Ecco una soluzione che funziona con codici ASCII estesi, ovvero fino a 255, ovvero ISO 8859-1
Trova e rimuove caratteri non ascii (maggiore di 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:
Ecco un violino funzionante per il codice
Sostituisci la codifica secondo il requisito, il resto dovrebbe rimanere lo stesso.
Questo non è un rendimento ottimale dal punto di vista delle prestazioni, ma un approccio Linq piuttosto diretto:
string strippedString = new string(
yourString.Where(c => c <= sbyte.MaxValue).ToArray()
);
Il rovescio della medaglia è che tutti i personaggi "sopravvissuti" vengono prima messi in una matrice di tipo char[]
che viene poi gettata via dopo che il string
costruttore non lo utilizza più.
Ho usato questa espressione regex:
string s = "søme string";
Regex regex = new Regex(@"[^a-zA-Z0-9\s]", (RegexOptions)0);
return regex.Replace(s, "");
Uso questa espressione regolare per filtrare i caratteri errati in un nome file.
Regex.Replace(directory, "[^a-zA-Z0-9\\:_\- ]", "")
Dovrebbero essere tutti i caratteri consentiti per i nomi dei file.