Für diejenigen von uns, die RegEx herausgefordert hatte, würde es Ihnen etwas ausmachen, Ihr RegEx-Muster in einfachem Englisch zu schreiben. Mit anderen Worten, "das ^ macht das" usw ...
Metro Smurf
47
@Metro Smurf the ^ ist der Nicht-Operator. Es weist den regulären Ausdruck an, alles zu finden, was nicht übereinstimmt, anstatt alles, was übereinstimmt. Das \ u #### - \ u #### gibt an, welche Zeichen übereinstimmen. \ U0000- \ u007F ist das Äquivalent der ersten 255 Zeichen in utf-8 oder Unicode, die immer die ASCII-Zeichen sind. Sie stimmen also mit jedem Nicht-ASCII-Zeichen überein (wegen des Nicht) und ersetzen alles, was übereinstimmt.
Gordon Tucker
41
Der Bereich für druckbare Zeichen ist 0020-007E, für Personen, die nach regulären Ausdrücken suchen, um nicht druckbare Zeichen zu ersetzen
Mubashar
1
@ GordonTucker \ u0000- \ u007F ist das Äquivalent der ersten 127 Zeichen in utf-8 oder Unicode und NICHT der ersten 225. Siehe Tabelle
full_prog_full
4
@full_prog_full Deshalb antwortete ich mir ungefähr eine Minute später und korrigierte mich, um zu sagen, dass es 127 und nicht 255 war. :)
Gordon Tucker
125
Hier ist eine reine .NET-Lösung, die keine regulären Ausdrücke verwendet:
Es mag umständlich aussehen, sollte aber intuitiv sein. Es verwendet die .NET ASCII-Codierung, um eine Zeichenfolge zu konvertieren. UTF8 wird während der Konvertierung verwendet, da es jedes der ursprünglichen Zeichen darstellen kann. Es verwendet einen EncoderReplacementFallback, um jedes Nicht-ASCII-Zeichen in eine leere Zeichenfolge zu konvertieren.
Perfekt! Ich verwende dies, um eine Zeichenfolge zu bereinigen, bevor ich sie in einem RTF-Dokument speichere. Sehr geschätzt. Viel einfacher zu verstehen als die Regex-Version.
Nathan Prather
21
Finden Sie es wirklich leichter zu verstehen? Für mich lenken alle Dinge, die nicht wirklich relevant sind (Fallbacks, Konvertierungen in Bytes usw.), die Aufmerksamkeit von dem ab, was tatsächlich passiert.
Bzlm
21
Es ist so, als würde man sagen, dass Schraubendreher zu verwirrend sind, also benutze ich stattdessen einfach einen Hammer.
Brandon
8
@Brandon, eigentlich macht diese Technik den Job nicht besser als andere Techniken. Die Analogie wäre also, einen einfachen alten Schraubendreher anstelle eines schicken iScrewDriver Deluxe 2000 zu verwenden. :)
bzlm
10
Ein Vorteil ist, dass ich ASCII leicht durch ISO 8859-1 oder eine andere Codierung ersetzen kann :)
Ich wusste nicht einmal, dass dies 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, um anderen das Auffinden zu erleichtern. Vielen Dank!
publicstaticstringPureAscii(thisstring source,char nil =' '){var min ='\u0000';var max ='\u007F';return source.Select(c => c < min ? nil : c > max ? nil : c).ToText();}publicstaticstringToText(thisIEnumerable<char> source){var buffer =newStringBuilder();foreach(var c in source)
buffer.Append(c);return buffer.ToString();}
Für diejenigen, die es nicht verstanden haben, ist dies eine C # 4.0 LINQ-basierte Lösung. :)
7
Wie wäre es, wenn Sie anstelle der separaten ToText () -Methode Zeile 3 von PureAscii () durch Folgendes ersetzen: return new string (source.Select (c => c <min? Null: c> max? Null: c) .ToArray ()) ;;
Agentnega
Oder vielleicht ToText als: return (neuer String (Quelle)). ToArray () - je nachdem, was am besten funktioniert. Es ist immer noch schön, ToText als Erweiterungsmethode zu haben - fließend / im Pipeline-Stil. :-)
Bent Rasmussen
Dieser Code ersetzt Nicht-ASCII-Zeichen durch ein Leerzeichen. Um sie zu return new string( source.Where( c => c >= min && c <= max ).ToArray() );
entfernen
@Foozinator Mit diesem Code können Sie angeben, durch welches Zeichen die Nicht-ASCII-Zeichen ersetzt werden sollen. Standardmäßig wird ein Leerzeichen verwendet, aber wenn es wie .PureASCII (Char.MinValue) aufgerufen wird, werden alle Nicht-ASCII-Zeichen durch '\ 0' ersetzt - was sie immer noch nicht genau entfernt, aber ähnliche Ergebnisse liefert.
Ulfius
5
keine Notwendigkeit für Regex. Verwenden Sie einfach die Codierung ...
Ich fand den folgenden leicht geänderten Bereich nützlich, um Kommentarblöcke aus einer Datenbank zu analysieren. Dies bedeutet, dass Sie nicht mit Tab- und Escape-Zeichen kämpfen müssen, die dazu führen würden, dass ein CSV-Feld verärgert wird.
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: asciitable.com
scradam
3
Ich bin hierher gekommen, um nach einer Lösung für erweiterte ASCII-Zeichen zu suchen, konnte sie aber nicht finden. Das nächste, was ich gefunden habe, ist die Lösung von bzlm . Aber das funktioniert nur für ASCII-Code bis 127 (natürlich können Sie den Codierungstyp in seinem Code ersetzen, aber ich denke, es war ein bisschen komplex zu verstehen. Daher diese Version zu teilen). Hier ist eine Lösung , die für arbeitet erweiterten ASCII - Codes , dh bis zu 255 , die das ist ISO 8859-1
Es werden Nicht-ASCII-Zeichen gefunden und entfernt (größer als 255).
Dim str1 asString="â, ??î or ôu🕧� n☁i✑💴++$-💯♓!🇪🚑🌚‼⁉4⃣od;/⏬'®;😁☕😁:☝)😁😁///😍1!@#"Dim extendedAscii AsEncoding=Encoding.GetEncoding("ISO-8859-1",NewEncoderReplacementFallback(String.empty),NewDecoderReplacementFallback())Dim extendedAsciiBytes()AsByte= extendedAscii.GetBytes(str1)Dim str2 AsString= extendedAscii.GetString(extendedAsciiBytes)
console.WriteLine(str2)'Output : â, ??î or ôu ni++$-!‼⁉4od;/';:)///1!@#$%^yz:
Der einzige, der NUR das Ω aus dieser Zeichenfolge "Ω c ç ã" entfernt hat. Vielen Dank!
Rafael Araújo
2
Dies ist in Bezug auf die Leistung nicht optimal, aber ein ziemlich direkter Linq-Ansatz:
string strippedString =newstring(
yourString.Where(c => c <=sbyte.MaxValue).ToArray());
Der Nachteil ist, dass alle "überlebenden" Zeichen zuerst in ein Array vom Typ eingefügt werden, char[]das dann weggeworfen wird, nachdem der stringKonstruktor es nicht mehr verwendet.
Du hast recht, Tom. Eigentlich habe ich an die gebräuchlichen gedacht, aber ich habe Klammern und geschweifte Klammern sowie all diese weggelassen - ^% $ # @! & + =.
Antworten:
quelle
Hier ist eine reine .NET-Lösung, die keine regulären Ausdrücke verwendet:
Es mag umständlich aussehen, sollte aber intuitiv sein. Es verwendet die .NET ASCII-Codierung, um eine Zeichenfolge zu konvertieren. UTF8 wird während der Konvertierung verwendet, da es jedes der ursprünglichen Zeichen darstellen kann. Es verwendet einen EncoderReplacementFallback, um jedes Nicht-ASCII-Zeichen in eine leere Zeichenfolge zu konvertieren.
quelle
Ich glaube, MonsCamus meinte:
quelle
Wenn Sie nicht streifen möchten, sondern tatsächlich lateinische Akzente in nicht akzentuierte Zeichen konvertieren möchten, werfen Sie einen Blick auf diese Frage: Wie übersetze ich 8-Bit-Zeichen in 7-Bit-Zeichen? (dh Ü bis U)
quelle
Inspiriert von Philcruz 'Regular Expression-Lösung habe ich eine reine LINQ-Lösung entwickelt
Dies ist ungetesteter Code.
quelle
return new string( source.Where( c => c >= min && c <= max ).ToArray() );
keine Notwendigkeit für Regex. Verwenden Sie einfach die Codierung ...
quelle
????nacho??
ich, als ich es versuchte:たまねこnachoなち
in Mono 3.4Ich fand den folgenden leicht geänderten Bereich nützlich, um Kommentarblöcke aus einer Datenbank zu analysieren. Dies bedeutet, dass Sie nicht mit Tab- und Escape-Zeichen kämpfen müssen, die dazu führen würden, dass ein CSV-Feld verärgert wird.
Wenn Sie andere Sonderzeichen oder bestimmte Satzzeichen vermeiden möchten, überprüfen Sie die ASCII-Tabelle
quelle
Ich bin hierher gekommen, um nach einer Lösung für erweiterte ASCII-Zeichen zu suchen, konnte sie aber nicht finden. Das nächste, was ich gefunden habe, ist die Lösung von bzlm . Aber das funktioniert nur für ASCII-Code bis 127 (natürlich können Sie den Codierungstyp in seinem Code ersetzen, aber ich denke, es war ein bisschen komplex zu verstehen. Daher diese Version zu teilen). Hier ist eine Lösung , die für arbeitet erweiterten ASCII - Codes , dh bis zu 255 , die das ist ISO 8859-1
Es werden Nicht-ASCII-Zeichen gefunden und entfernt (größer als 255).
Hier ist eine funktionierende Geige für den Code
Ersetzen Sie die Codierung gemäß den Anforderungen, der Rest sollte gleich bleiben.
quelle
Dies ist in Bezug auf die Leistung nicht optimal, aber ein ziemlich direkter Linq-Ansatz:
Der Nachteil ist, dass alle "überlebenden" Zeichen zuerst in ein Array vom Typ eingefügt werden,
char[]
das dann weggeworfen wird, nachdem derstring
Konstruktor es nicht mehr verwendet.quelle
Ich habe diesen regulären Ausdruck verwendet:
quelle
Ich benutze diesen regulären Ausdruck, um schlechte Zeichen in einem Dateinamen herauszufiltern.
Das sollten alle Zeichen sein, die für Dateinamen zulässig sind.
quelle