对于这个问题中希望在30秒内得到答案的部分,我特别寻找C#方面的解决方案。
但是在一般情况下,如何最好地去除任何语言中的标点符号?
我应该补充说明: 理想情况下,解决方案不需要枚举所有可能的标点符号。
对于这个问题中希望在30秒内得到答案的部分,我特别寻找C#方面的解决方案。
但是在一般情况下,如何最好地去除任何语言中的标点符号?
我应该补充说明: 理想情况下,解决方案不需要枚举所有可能的标点符号。
new string(myCharCollection.Where(c => !char.IsPunctuation(c)).ToArray());
!char.IsSymbol(c)
进行验证。仅供记录。 - Razvan Dumitru为什么不直接这样写:
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 中使用这样的代码...
描述意图,易于阅读(仅为个人意见)且性能最佳:
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的算法,该算法是发布的一堆算法中最优秀的。
假如“best”指的是“最简单”,我建议使用类似这样的方法:
String stripped = input.replaceAll("\\p{Punct}+", "");
这个示例是针对Java的,但所有足够现代的正则表达式引擎都应该支持这个(或类似的)。
编辑:Unicode感知版本如下:
String stripped = input.replaceAll("\\p{P}+", "");
第一个版本只考虑ASCII中包含的标点符号。
Punct
类,但它确实有 P
。 - JProgrammer replace(YourString, RegularExpressionWithPunctuationMarks, Empty String)
string s = Regex.Replace("Hello!?!?!?!", "[?!]", "");
如果您想要的话,您可以将“[?!]”替换为更复杂的内容:
(\p{P})
这应该可以找到任何标点符号。
这个帖子太老了,但我认为我应该发布一个更优雅的解决方案。
string inputSansPunc = input.Where(c => !char.IsPunctuation(c)).Aggregate("", (current, c) => current + c);
在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; }));
new string(myText.Select(c => char.IsPunctuation(c) ? ' ' : c).ToArray())
如果有人想通过正则表达式来实现这个功能:
以下代码展示了完整的正则表达式替换过程,并提供了一个样例正则表达式,只保留字符串中的字母、数字和空格 - 用空字符串替换所有其他字符:
//Regex to remove all non-alphanumeric characters
System.Text.RegularExpressions.Regex TitleRegex = new
System.Text.RegularExpressions.Regex("[^a-z0-9 ]+",
System.Text.RegularExpressions.RegexOptions.IgnoreCase);
string ParsedString = TitleRegex.Replace(stringToParse, String.Empty);
return ParsedString;
最简单的方法是使用string.replace。
另一种想象中的方法是使用regex.replace,并将你的正则表达式与所有适当的标点符号放在一起。