2008-09-23 5 views

Antwort

355
string s = "søme string"; 
s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty); 
+14

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. ... –

+42

@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. –

+3

nicht 255, 127 .. sorry bout that :) –

96

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

+3

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. –

+18

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

+0

habe ich dieses Beispiel lieben! – possan

8

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.

+1

Für diejenigen, die es nicht verstanden haben, ist dies eine C# 4.0 LINQ-basierte Lösung. :) –

+6

Anstelle der separaten ToText() -Methode, wie ersetzen Sie Zeile 3 von PureAscii() mit: return new string (source.Select (c => c max? Nil: c). ZuArray()); – agentnega

+0

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. :-) –

13

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)

+0

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

1

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, ""); 
+15

Das entfernt auch Interpunktion, nur für den Fall, dass das nicht was jemand will. –

4

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

+1

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

6

keine Notwendigkeit für regex vermeiden wollen. nur Codierung verwenden ...

sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput)); 
+0

+1 große Antwort und die einfachste aus den oben aufgeführten ... – Anonymous

+5

Dies funktioniert nicht. Dies entfernt Unicode-Zeichen nicht, ersetzt sie durch die? Charakter. – David

+1

@David hat Recht. Zumindest habe ich '???? nacho ??', als ich es versuchte: 'た ま ね こ nacho な ち' in Mono 3.4 – nacho4d

25

Ich glaube MonsCamus gemeint:

parsememo = Regex.Replace(parsememo, @"[^\u0020-\u007E]", string.Empty); 
+1

IMHO Diese Antwort ist besser als die angenommene Antwort, weil es Steuerzeichen ausstreicht. – Dean2690

+0

LED   Expo Thailand ist bereit für seine neue Ausgabe auf   LED   Technologie, wie ASCII-Code in C# – Singapore

2

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.

2

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.

0

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.

+0

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. –

+0

Sie haben Recht, Tom. Ich habe tatsächlich an die üblichen gedacht, aber ich habe Klammern und geschweifte Klammern sowie all diese weggelassen - ^% $ # @! & + =. – user890332

Verwandte Themen