2009-01-07 217 views
55

對於這個問題希望有一個答案在30秒內的一部分,我特別尋找C#如何從字符串中去除標點符號?

但在一般情況下,什麼是最好的方式去除任何標點符號語言?

我應該加:理想情況下,解決方案不會要求您列舉所有可能的標點符號。

相關:Strip Punctuation in Python

+0

不同的語言,其實是不同的,我不認爲你有問題的答案。你可以詢問特定的語言,或者哪種語言最適合這種操作。 – 2010-06-17 17:23:34

回答

3

這樣做將使用與string.replace

另一條路我會想象的最新空房禁地簡單的方法是regex.replace並與所有相應的標點符號有你的正則表達式標記在其中。

13

假設「最佳」的意思是「最簡單的」我建議使用這樣的事情:

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

這個例子是Java,但所有足夠現代的正則表達式引擎應該支持這個(或類似的東西)。

編輯:Unicode的版本會是這樣:

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

第一個版本僅僅着眼於包含在ASCII標點符號。

+0

C#沒有`Punct`類,但它確實有'P` – JProgrammer 2017-12-17 21:28:45

85
new string(myCharCollection.Where(c => !char.IsPunctuation(c)).ToArray()); 
+0

是的。它支持我在下面發佈的字符串操作。 – 2009-01-07 19:24:18

+4

LinQ永遠不會驚歎我。 – Dermot 2012-07-28 02:57:13

+0

輝煌。少即是多。 – 2013-08-21 08:08:15

8

可以使用regex.replace方法:

replace(YourString, RegularExpressionWithPunctuationMarks, Empty String) 

由於該返回一個字符串,你的方法是這個樣子:

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

您可以替換「[? !]「,如果你想要更復雜的東西:

(\p{P}) 

這應該找到任何標點符號。

4

基於關閉GWLlosa的想法,我能想出的超級難看,但工作:

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; })); 
1

下面是使用LINQ稍微不同的方法。我喜歡AviewAnew的,但這樣就避免了總結

 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); 
17

爲什麼不乾脆:

 
string s = "sxrdct?fvzguh,bij."; 
var sb = new StringBuilder(); 

foreach (char c in s) 
{ 
    if (!char.IsPunctuation(c)) 
     sb.Append(c); 
} 

s = sb.ToString(); 

正則表達式的使用通常比簡單字符運算慢。那些LINQ操作看起來對我來說太過於矯枉過正。而且你不能在.NET 2.0中使用這樣的代碼...

0
#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 
9

描述意圖,最容易讀(恕我直言)和最佳表演:

s = s.StripPunctuation(); 

來實現:

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(); 
    } 
} 

這是使用Hades32的算法是一堆表現最好的發佈。

1
$newstr=ereg_replace("[[:punct:]]",'',$oldstr); 
6

這個線程太舊了,但我不想發佈一個更優雅的(IMO)解決方案。

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

這是LINQ sans WTF。

0

對於長字符串我用這個:

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

性能比使用字符串連接更好(雖然我同意這是不太直觀)。

1

我面臨同樣的問題,並擔心爲每個檢查調用IsPunctuation的性能影響。

我發現這個職位:http://www.dotnetperls.com/char-ispunctuation

跨行:char.IsPunctuation還處理ASCII上的Unicode。 該方法匹配一堆包含控制字符的字符。通過定義,這種方法沉重且昂貴。

底線是我終於沒有去找它,因爲它對我的ETL過程的性能影響。

我去了dotnetperls的自定義實現。

,僅供參考,突出部分,這裏是一些代碼從以前的答案演繹得所有的標點字符列表(不包括控制者):

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); 

乾杯, 安德魯

1

如果你想使用這個標記文本,你可以使用:

new string(myText.Select(c => char.IsPunctuation(c) ? ' ' : c).ToArray()) 
相關問題