Réponses:
string s = "søme string";
s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty);
Voici une solution .NET pure qui n'utilise pas d'expressions régulières:
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)
)
);
Cela peut sembler lourd, mais cela devrait être intuitif. Il utilise l'encodage ASCII .NET pour convertir une chaîne. UTF8 est utilisé lors de la conversion car il peut représenter n'importe lequel des caractères d'origine. Il utilise un EncoderReplacementFallback pour convertir tout caractère non ASCII en une chaîne vide.
Si vous ne voulez pas supprimer, mais convertir les caractères accentués latins en caractères non accentués, jetez un œil à cette question: Comment traduire des caractères 8 bits en caractères 7 bits? (c'est-à-dire Ü à U)
Inspiré par la solution d'expression régulière de philcruz , j'ai créé une solution LINQ pure
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();
}
Il s'agit d'un code non testé.
return new string( source.Where( c => c >= min && c <= max ).ToArray() );
pas besoin de regex. utilisez simplement l'encodage ...
sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput));
????nacho??
quand j'ai essayé: たまねこnachoなち
en mono 3.4
J'ai trouvé la plage légèrement modifiée suivante utile pour analyser les blocs de commentaires d'une base de données, cela signifie que vous n'aurez pas à composer avec des tabulations et des caractères d'échappement qui pourraient perturber un champ CSV.
parsememo = Regex.Replace(parsememo, @"[^\u001F-\u007F]", string.Empty);
Si vous voulez éviter d'autres caractères spéciaux ou une ponctuation particulière, consultez le tableau ascii
Je suis venu ici à la recherche d'une solution pour les caractères ascii étendus, mais je ne l'ai pas trouvée. Le plus proche que j'ai trouvé est la solution de bzlm . Mais cela ne fonctionne que pour le code ASCII jusqu'à 127 (évidemment, vous pouvez remplacer le type d'encodage dans son code, mais je pense que c'était un peu complexe à comprendre. Par conséquent, partager cette version). Voici une solution qui fonctionne pour les codes ASCII étendus, c'est-à-dire jusqu'à 255, qui est l' ISO 8859-1
Il trouve et supprime les caractères non ascii (supérieurs à 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:
Voici un violon de travail pour le code
Remplacez l'encodage selon l'exigence, le reste doit rester le même.
Ce n'est pas une performance optimale, mais une approche Linq assez simple:
string strippedString = new string(
yourString.Where(c => c <= sbyte.MaxValue).ToArray()
);
L'inconvénient est que tous les personnages "survivants" sont d'abord placés dans un tableau de type char[]
qui est ensuite jeté après que le string
constructeur ne l'utilise plus.
J'ai utilisé cette expression régulière:
string s = "søme string";
Regex regex = new Regex(@"[^a-zA-Z0-9\s]", (RegexOptions)0);
return regex.Replace(s, "");
J'utilise cette expression régulière pour filtrer les mauvais caractères dans un nom de fichier.
Regex.Replace(directory, "[^a-zA-Z0-9\\:_\- ]", "")
Cela devrait être tous les caractères autorisés pour les noms de fichiers.