it-swarm.com.de

Wie kann ich Interpunktion aus einer Zeichenfolge entfernen?

Für den Teil mit der Hoffnung, in 30 Sekunden eine Antwort zu haben, suche ich speziell nach C #.

Aber wie lässt sich im Allgemeinen die Zeichensetzung in einer Sprache am besten entfernen?

Ich sollte hinzufügen: Idealerweise müssen Sie bei den Lösungen nicht alle möglichen Satzzeichen aufzählen.

Siehe auch: Zeichensetzung in Python

63
Tom Ritter
new string(myCharCollection.Where(c => !char.IsPunctuation(c)).ToArray());
100
GWLlosa

Warum nicht einfach:

 string s = "sxrdct? fvzguh, bij."; 
 var sb = neuer StringBuilder (); 
 
 foreach (char c in s) 
 {
 if (! char.IsPunctuation (c)) 
 sb.Append (c); 
} 
 
 s = sb. ToString (); 

Die Verwendung von RegEx ist normalerweise langsamer als einfache Zeichenoperationen. Und diese LINQ-Operationen sehen für mich übertrieben aus. Und Sie können solchen Code in .NET 2.0 nicht verwenden ...

18
Hades32

Angenommen, "best" bedeutet "einfach". Ich schlage vor, so etwas zu verwenden:

String stripped = input.replaceAll("\\p{Punct}+", "");

Dieses Beispiel ist für Java, , aber alle ausreichend modernen Regex-Engines sollten dies (oder etwas Ähnliches) unterstützen.

Bearbeiten: die Unicode-Aware-Version wäre:

String stripped = input.replaceAll("\\p{P}+", "");

Die erste Version befasst sich nur mit Interpunktionszeichen in ASCII.

13
Joachim Sauer

Beschreibt die Absicht, die am einfachsten zu lesende (IMHO) und die beste Leistung:

 s = s.StripPunctuation();

implementieren:

public static class StringExtension
{
    public static string StripPunctuation(this string s)
    {
        var sb = new StringBuilder();
        foreach (char c in s)
        {
            if (!char.IsPunctuation(c))
                sb.Append(c);
        }
        return sb.ToString();
    }
}

Hierbei wird der Algorithmus von Hades32 verwendet, der die beste Leistung der geposteten Gruppe erbrachte.

11
Brian Low

Sie können die Methode regex.replace verwenden:

 replace(YourString, RegularExpressionWithPunctuationMarks, Empty String)

Da dies einen String zurückgibt, sieht Ihre Methode ungefähr so ​​aus:

 string s = Regex.Replace("Hello!?!?!?!", "[?!]", "");

Sie können "[?!]" Durch etwas Anspruchsvolleres ersetzen, wenn Sie möchten:

(\p{P})

Dies sollte Interpunktion finden.

8
Anton

Dieser Thread ist so alt, aber ich würde es mir nicht leisten, eine elegantere (IMO) Lösung zu veröffentlichen.

string inputSansPunc = input.Where(c => !char.IsPunctuation(c)).Aggregate("", (current, c) => current + c);

Es ist LINQ ohne WTF.

6
Nick Vaccaro

Basierend auf der Idee von GWLlosa konnte ich die höchst hässliche, aber funktionierende Idee entwickeln:

string s = "cat!";
s = s.ToCharArray().ToList<char>()
      .Where<char>(x => !char.IsPunctuation(x))
      .Aggregate<char, string>(string.Empty, new Func<string, char, string>(
             delegate(string s, char c) { return s + c; }));
4
Tom Ritter

Die einfachste Art, dies zu tun, wäre string.replace

Der andere Weg, den ich mir vorstellen würde, ist ein regulärer Ausdruck, der alle passenden Interpunktionszeichen enthält.

3
TheTXI

Wenn Sie dies zum Tokenisieren von Text verwenden möchten, können Sie Folgendes verwenden:

new string(myText.Select(c => char.IsPunctuation(c) ? ' ' : c).ToArray())
2
Chris Marisic

Ich hatte das gleiche Problem und war besorgt über die Auswirkungen auf die Leistung, wenn ich die IsPunctuation für jede einzelne Prüfung aufrufe.

Ich habe diesen Beitrag gefunden: http://www.dotnetperls.com/char-ispunctuation .

Über die Zeilen: char.IsPunctuation behandelt auch Unicode über ASCII. Die Methode stimmt mit einer Reihe von Zeichen einschließlich Steuerzeichen überein. Auf jeden Fall ist diese Methode schwer und teuer.

Das Fazit ist, dass ich mich letztendlich nicht dafür entschieden habe, weil sich dies auf die Leistung meines ETL-Prozesses auswirkt.

Ich habe mich für die benutzerdefinierte Implementierung von dotnetperls entschieden.

Und abgesehen davon, hier ist ein Code, der aus den vorherigen Antworten abgeleitet wurde, um die Liste aller Interpunktionszeichen (mit Ausnahme der Kontrollzeichen) zu erhalten:

var punctuationCharacters = new List<char>();

        for (int i = char.MinValue; i <= char.MaxValue; i++)
        {
            var character = Convert.ToChar(i);

            if (char.IsPunctuation(character) && !char.IsControl(character))
            {
                punctuationCharacters.Add(character);
            }
        }

        var commaSeparatedValueOfPunctuationCharacters = string.Join("", punctuationCharacters);

        Console.WriteLine(commaSeparatedValueOfPunctuationCharacters);

Prost, Andrew

1
Matt

Hier ist ein etwas anderer Ansatz mit linq. Ich mag AviewAnews, aber dies vermeidet das Aggregat

        string myStr = "Hello there..';,]';';., Get rid of Punction";

        var s = from ch in myStr
                where !Char.IsPunctuation(ch)
                select ch;

        var bytes = UnicodeEncoding.ASCII.GetBytes(s.ToArray());
        var stringResult = UnicodeEncoding.ASCII.GetString(bytes);
1
JoshBerke
$newstr=ereg_replace("[[:punct:]]",'',$oldstr);
1
Ash Youssef
#include<string>
    #include<cctype>
    using namespace std;

    int main(int a, char* b[]){
    string strOne = "H,e.l/l!o W#[email protected]^l&d!!!";
    int punct_count = 0;

cout<<"before : "<<strOne<<endl;
for(string::size_type ix = 0 ;ix < strOne.size();++ix)   
{   
    if(ispunct(strOne[ix])) 
    {
            ++punct_count;  
            strOne.erase(ix,1); 
            ix--;
    }//if
}
    cout<<"after : "<<strOne<<endl;
                  return 0;
    }//main
0
brain

Für lange Streicher verwende ich folgendes:

var normalized = input
                .Where(c => !char.IsPunctuation(c))
                .Aggregate(new StringBuilder(),
                           (current, next) => current.Append(next), sb => sb.ToString());

bietet eine viel bessere Leistung als die Verwendung von Zeichenfolgenverkettungen (obwohl ich der Meinung bin, dass dies weniger intuitiv ist).

0
Shay Ben-Sasson