如何从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我同意它不那么直观)。