如何从string中去除标点符号?

对于这个问题希望有一个答案在30秒的一部分,我特别寻找C#

但在一般情况下,删除任何语言的标点符号的最佳方法是什么?

我应该补充:理想情况下,解决scheme不会要求您列举所有可能的标点符号。

相关: Python中的标点符号

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

为什么不简单:

 string s =“sxrdct?fvzguh,bij。”;
 var sb = new StringBuilder();

 foreach(char c in s)
 {
   如果(!char.IsPunctuation(c))
       sb.Append(C);
 }

 s = sb.ToString();

RegEx的使用通常比简单的char操作慢。 那些LINQ操作看起来对我来说太过分了。 而且你不能在.NET 2.0中使用这样的代码…

假设“最好”意味着“最简单”,我build议使用这样的东西:

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

这个例子适用于Java,但是所有足够现代化的正则expression式引擎都应该支持这个(或类似的)。

编辑:Unicode感知版本将是这样的:

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

第一个版本只查看ASCII中包含的标点符号。

描述意图,最容易阅读(恕我直言)和最佳performance:

  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的algorithm,这是发布的最好的performance。

你可以使用regex.replace方法:

  replace(YourString, RegularExpressionWithPunctuationMarks, Empty String) 

由于这将返回一个string,你的方法看起来像这样:

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

你可以用更复杂的东西代替“[?!]”,如果你想:

 (\p{P}) 

这应该find任何标点符号。

这个线程太旧了,但我不想发布更优雅的(IMO)解决scheme。

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

这是LINQ无跆拳道。

根据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; })); 

最聪明的方法就是使用string.replace

另一种方法,我会想象的是一个regex.replace和正则expression式中的所有适当的标点符号。

这里使用linq稍微不同的方法。 我喜欢AviewAnew的,但是这避免了Aggregate

  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); 
 $newstr=ereg_replace("[[:punct:]]",'',$oldstr); 

我面临同样的问题,并担心每个检查调用IsPunctuation的性能影响。

我发现这个职位: http : //www.dotnetperls.com/char-ispunctuation 。

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

干杯,安德鲁

如果你想用这个来标记文本,你可以使用:

 new string(myText.Select(c => char.IsPunctuation(c) ? ' ' : c).ToArray()) 
 #include<string> #include<cctype> using namespace std; int main(int a, char* b[]){ string strOne = "H,el/l!o W#o@r^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 

对于长string,我使用这个:

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

性能比使用string连接要好得多(尽pipe我同意它不那么直观)。