Wie können Sie Nicht-ASCII-Zeichen aus einer Zeichenfolge entfernen? (In C#)Wie können Sie Nicht-ASCII-Zeichen aus einer Zeichenfolge entfernen? (in C#)
Antwort
string s = "søme string";
s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty);
Für diejenigen von uns RegEx'd herausgefordert, würde es Ihnen etwas ausmachen, in Englisch Ihr RegEx-Muster zu schreiben. Mit anderen Worten, "das tut das", usw. ... –
@Metro Schlumpf der^ist der Nicht-Operator. Es sagt der Regex, dass sie alles findet, was nicht passt, und nicht alles, was passt. Die \ u #### - \ u #### sagt, welche Zeichen übereinstimmen. \ U0000- \ u007F ist das Äquivalent der ersten 255 Zeichen in utf-8 oder Unicode, die immer die ASCII-Zeichen sind. Sie passen also alle nicht ASCII-Zeichen (wegen der nicht) und ersetzen alles, was übereinstimmt. –
nicht 255, 127 .. sorry bout that :) –
Hier ist eine reine .NET-Lösung, die keine regulären Ausdrücke nicht verwendet:
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)
)
);
Es kann umständlich aussehen, aber es sollte intuitiv sein. Es verwendet die .NET ASCII-Codierung, um eine Zeichenfolge zu konvertieren. UTF8 wird während der Konvertierung verwendet, da es beliebige der ursprünglichen Zeichen darstellen kann. Es verwendet einen EncoderReplacementFallback, um alle Nicht-ASCII-Zeichen in eine leere Zeichenfolge zu konvertieren. Dies ist ungetestet Code
Perfekt! Ich verwende dies, um eine Zeichenfolge zu bereinigen, bevor Sie sie in einem RTF-Dokument speichern. Sehr geschätzt. Viel einfacher zu verstehen als die Regex-Version. –
Sie finden es wirklich leichter zu verstehen? Für mich sind all die Dinge, die nicht wirklich relevant sind (Fallbacks, Konvertierungen in Bytes usw.), die Aufmerksamkeit von dem, was tatsächlich passiert, abzulenken. – bzlm
habe ich dieses Beispiel lieben! – possan
von philcruz's Regular Expression solution inspiriert, ich habe
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();
}
eine reine LINQ-Lösung hergestellt.
Für diejenigen, die es nicht verstanden haben, ist dies eine C# 4.0 LINQ-basierte Lösung. :) –
Anstelle der separaten ToText() -Methode, wie ersetzen Sie Zeile 3 von PureAscii() mit: return new string (source.Select (c => c
Oder vielleicht ToText als: return (neue Zeichenkette (Quelle)). ToArray() - je nachdem, was am besten funktioniert. Es ist immer noch schön, ToText als eine Erweiterungsmethode zu haben - fließend/Pipeline-Stil. :-) –
Wenn Sie nicht wollen, strippen, sondern tatsächlich lateinische akzentuierte zu nicht-akzentuierte Zeichen konvertieren, einen Blick auf diese Frage nehmen: How do I translate 8bit characters into 7bit characters? (i.e. Ü to U)
Ich wusste nicht einmal, dass das möglich ist, aber es ist eine viel bessere Lösung für mich. Ich werde diesen Link zu einem Kommentar zu der Frage hinzufügen, damit andere Personen leichter finden können. Vielen Dank! – Bobson
ich diesen regulären Ausdruck verwendet:
string s = "søme string";
Regex regex = new Regex(@"[^a-zA-Z0-9\s]", (RegexOptions)0);
return regex.Replace(s, "");
Das entfernt auch Interpunktion, nur für den Fall, dass das nicht was jemand will. –
gefunden der folgende leicht geänderte Bereich, der nützlich ist, um Kommentarblöcke aus einer Datenbank zu analysieren, bedeutet, dass Sie nicht mit Tab- und Escape-Zeichen zurechtkommen müssen, was dazu führen würde, dass ein CSV-Feld gestört wird.
parsememo = Regex.Replace(parsememo, @"[^\u001F-\u007F]", string.Empty);
Wenn Sie andere Sonderzeichen oder besondere Zeichensetzung überprüfen the ascii table
Falls jemand die anderen Kommentare nicht bemerkt hat, sind die druckbaren Zeichen tatsächlich @ "[^ \ u0020- \ u007E]". Hier ist ein Link, um die Tabelle zu sehen, wenn Sie neugierig sind: http://www.asciitable.com/ – scradam
keine Notwendigkeit für regex vermeiden wollen. nur Codierung verwenden ...
sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput));
+1 große Antwort und die einfachste aus den oben aufgeführten ... – Anonymous
Dies funktioniert nicht. Dies entfernt Unicode-Zeichen nicht, ersetzt sie durch die? Charakter. – David
@David hat Recht. Zumindest habe ich '???? nacho ??', als ich es versuchte: 'た ま ね こ nacho な ち' in Mono 3.4 – nacho4d
Ich glaube MonsCamus gemeint:
parsememo = Regex.Replace(parsememo, @"[^\u0020-\u007E]", string.Empty);
Diese nicht optimale Performance-weise, aber ein ziemlich geradlinig Linq Ansatz:
string strippedString = new string(
yourString.Where(c => c <= sbyte.MaxValue).ToArray()
);
Die Nachteil ist, dass alle "überlebenden" Zeichen zuerst in ein Array vom Typ char[]
gelegt werden, das dann weggeworfen wird, nachdem der string
Konstruktor es nicht mehr benutzt.
Ich kam hier auf der Suche nach einer Lösung für erweiterte ASCII-Zeichen, aber konnte es nicht finden. Der nächste, den ich gefunden habe, ist bzlm's solution. Aber das funktioniert nur für ASCII-Code bis 127 (natürlich können Sie den Kodierungstyp in seinem Code ersetzen, aber ich denke, es war ein bisschen kompliziert zu verstehen. Daher diese Version zu teilen). Hier ist eine Lösung, die für extended ASCII codes i.e. upto 255 arbeitet, die die ISO 8859-1
Es findet und Streifen aus Nicht-ASCII-Zeichen (größer als 255)
Dim str1 as String= "â, ??î or ôu� n☁i✑++$-♓!‼⁉4⃣od;/⏬'®;☕:☝)///[email protected]#"
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;/';:)///[email protected]#$%^yz:
Hier ist ein working fiddle for the code
Ersetzen Sie die Codierung nach der Anforderung , Ruhe sollte gleich bleiben.
Ich benutze diesen regulären Ausdruck, um schlechte Zeichen in einem Dateinamen herauszufiltern.
Regex.Replace(directory, "[^a-zA-Z0-9\\:_\- ]", "")
Das sollten alle Zeichen sein, die für Dateinamen erlaubt sind.
Nö zu entfernen. Siehe [Path.GetInvalidPathChars] (https://msdn.microsoft.com/en-us/library/system.io.path.getinvalidpathchars (v = vs.110) .aspx) und [Path.GetInvalidFileNameChars] (https://msdn.microsoft.com/en-us/library/system.io.path.getinvalidfilenamechars(v=vs.110).aspx). Also, es gibt Zehntausende von gültigen Zeichen. –
Sie haben Recht, Tom. Ich habe tatsächlich an die üblichen gedacht, aber ich habe Klammern und geschweifte Klammern sowie all diese weggelassen - ^% $ # @! & + =. – user890332
- 1. Wie können Sie Steuerzeichen aus einer Zeichenfolge entfernen?
- 2. Entfernen Sie. Txt aus Zeichenfolge in C
- 3. Entfernen Sie Zeichenfolge in einer Textdatei aus einer anderen Textdatei
- 4. Entfernen Sie alle Leerzeichen aus einer Zeichenfolge
- 5. Entfernen Sie überschüssige Leerzeichen aus einer Zeichenfolge
- 6. Entfernen Sie Zeichen aus der Zeichenfolge in Standard C
- 7. Entfernen von Leerzeichen aus einer Zeichenfolge
- 8. Wie PHP-Code aus einer Zeichenfolge entfernen?
- 9. Fallsensitivität aus einer Zeichenfolge entfernen
- 10. Entfernen eines Zeichens aus einer Zeichenfolge in C
- 11. So entfernen Sie Unicode-Symbol aus vietnamesischen Zeichenfolge in C#
- 12. Entfernen Sie HTML-Tags aus Zeichenfolge einschließlich & Nbsp in C#
- 13. Wie 'em' Strich aus einer Zeichenfolge entfernen?
- 14. Wie können Sie einfach bestimmte Wörter aus einer Textzeichenfolge entfernen?
- 15. Objective C - Entfernen Sie das letzte Zeichen aus der Zeichenfolge
- 16. Wie entfernen Sie alle alphabetischen Zeichen aus einer Zeichenfolge?
- 17. Entfernen Sie alle Sonderzeichen aus einer Zeichenfolge in R?
- 18. Entfernen Sie einen langen Strich aus einer Zeichenfolge in JavaScript?
- 19. Entfernen Sie alle Zeilen mit bestimmten Werten aus einer Zeichenfolge.
- 20. Entfernen Sie Dateierweiterung und Pfad aus einer Zeichenfolge in Perl
- 21. So entfernen Sie alle Grammatik aus einer Zeichenfolge in Java
- 22. Entfernen Sie SSN (Sozialversicherungsnummer) aus einer Zeichenfolge in SQL
- 23. C# Entfernen Strings aus Ende der Zeichenfolge
- 24. Entfernen aller Zeichen aus einer gegebenen Zeichenfolge
- 25. Reguläre Ausdrücke: Entfernen von [#####: #####] aus einer Zeichenfolge
- 26. entfernen leere Zeile aus Zeichenfolge C#
- 27. Entfernen Sie nth Zeichen aus Zeichenfolge
- 28. So entfernen Sie unerwünschte Zeichen aus einer Zeichenfolge?
- 29. Entfernen Sie C++ - Klassennamen aus Binärdll-Datei
- 30. Entfernen eines Nullzeichens aus einer Zeichenfolge in JavaScript
Per sinelaws Antwort [unten] (http://stackoverflow.com/a/10036919/298754), wenn Sie stattdessen * Nicht-ASCII-Zeichen * ersetzen möchten, finden Sie [diese Antwort] (http: // stackoverflow.com/a/10036907/562906) statt **. – Bobson