C# 如何从字符串中去掉标点符号?
对于这个问题希望在30秒内得到答案的部分,我特别寻找C# 但在一般情况下,在任何语言中去除标点符号的最佳方法是什么 我应该补充:理想情况下,解决方案不需要您列举所有可能的标点符号C# 如何从字符串中去掉标点符号?,c#,string,C#,String,对于这个问题希望在30秒内得到答案的部分,我特别寻找C# 但在一般情况下,在任何语言中去除标点符号的最佳方法是什么 我应该补充:理想情况下,解决方案不需要您列举所有可能的标点符号 相关:最简单的方法是使用string.replace 另一种方法是使用regex.replace替换正则表达式,并在其中添加所有适当的标点符号。假设“最佳”表示“最简单”,我建议使用以下方法: String stripped = input.replaceAll("\\p{Punct}+", ""); string
相关:最简单的方法是使用string.replace 另一种方法是使用regex.replace替换正则表达式,并在其中添加所有适当的标点符号。假设“最佳”表示“最简单”,我建议使用以下方法:
String stripped = input.replaceAll("\\p{Punct}+", "");
string s = Regex.Replace("Hello!?!?!?!", "[?!]", "");
这个例子是为,但所有足够现代的正则表达式引擎都应该支持这个(或类似的东西)
编辑:支持Unicode的版本如下:
String stripped = input.replaceAll("\\p{P}+", "");
第一个版本只查看ASCII中包含的标点符号。您可以使用regex.replace方法:
new string(myCharCollection.Where(c => !char.IsPunctuation(c)).ToArray());
replace(YourString, RegularExpressionWithPunctuationMarks, Empty String)
由于这将返回一个字符串,因此您的方法将如下所示:
String stripped = input.replaceAll("\\p{Punct}+", "");
string s = Regex.Replace("Hello!?!?!?!", "[?!]", "");
如果您愿意,可以用更复杂的内容替换“[?!]”:
(\p{P})
这应该可以找到任何标点符号。基于格洛萨的想法,我想出了非常难看的,但很有效的:
string s=“cat!”;
s=s.ToCharArray().ToList()
.Where(x=>!char.ispunchuation(x))
.Aggregate(string.Empty,新函数(
委托(字符串s,字符c){返回s+c;});
这里有一个稍微不同的使用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);
为什么不简单地:
string s = "sxrdct?fvzguh,bij.";
var sb = new StringBuilder();
foreach (char c in s)
{
if (!char.IsPunctuation(c))
sb.Append(c);
}
s = sb.ToString();
字符串s=“sxrdct?fvzguh,bij。”;
var sb=新的StringBuilder();
foreach(字符c在s中)
{
如果(!char.ispunchuation(c))
sb.附加(c);
}
s=sb.ToString();
正则表达式的使用通常比简单的字符操作慢。那些LINQ的行动在我看来太过分了。而且你不能在.NET2.0中使用这样的代码…\include
#include<string>
#include<cctype>
using namespace std;
int main(int a, char* b[]){
string strOne = "H,e.l/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
#包括
使用名称空间std;
int main(int a,char*b[]{
string strOne=“H,e.l/l!o W#o@r^l&d!!!”;
int punct_计数=0;
cout描述了意图、易读性(IMHO)和最佳性能:
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的算法,它是所发布的一系列算法中性能最好的。这个线程太旧了,但是如果我不发布一个更优雅的(IMO)解决方案,那我就失职了
$newstr=ereg_replace("[[:punct:]]",'',$oldstr);
string inputSansPunc = input.Where(c => !char.IsPunctuation(c)).Aggregate("", (current, c) => current + c);
它是LINQ sans WTF。对于长字符串,我使用以下命令:
var normalized = input
.Where(c => !char.IsPunctuation(c))
.Aggregate(new StringBuilder(),
(current, next) => current.Append(next), sb => sb.ToString());
性能比使用字符串连接要好得多(尽管我同意这不太直观)。我面临同样的问题,并且担心每次检查调用ispuncutation会对性能造成影响
我找到了这个帖子:
Accross-the-lines:char.ispuncuation还处理ASCII之上的Unicode。
该方法匹配包括控制字符在内的一系列字符。根据定义,该方法既繁重又昂贵
归根结底,我最终没有选择它,因为它对我的ETL过程的性能有影响
我选择了dotnetperls的习俗
仅供参考,以下是从前面的答案中推导出的一些代码,用于获取所有标点符号(不包括控制符号)的列表:
var标点符号=新列表();
对于(int i=char.MinValue;i如果要将其用于标记文本,可以使用:
new string(myText.Select(c => char.IsPunctuation(c) ? ' ' : c).ToArray())
对于希望通过RegEx执行此操作的任何人:
这段代码显示了完整的正则表达式替换过程,并给出了一个示例正则表达式,该正则表达式仅在字符串中保留字母、数字和空格-将所有其他字符替换为空字符串:
//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;
是的。它为我在下面发布的字符串操作提供了动力。LinQ永远不会停止让我惊讶。太棒了。少就是多。对$or^不起作用,也许更多。我坚持用^[a-zA-Z][a-zA-Z0-9]*$换$or^你可以使用!char.IsSymbol(c)
验证。只是为了记录我知道的;对吗?我的爱好是对Linq中的代码犯错误。但是,请尽一切可能让它变得更好。请寻求精神帮助。这是以s为单位的长度的平方倍;如果将长度加倍,代码将慢四倍,因为字符串的+运算符必须复制字符串:/有趣的小贴士:以下不是标点:$^+|=事实上,不同的语言是不同的,我认为你所问的问题没有答案。你可以询问特定的语言,或者哪种语言最适合这种操作。+1用于使用unicode字符类。简洁、精确、漂亮。为什么eIEnumerable
到数组到字节到字符串的转换,为什么不干脆新字符串(s.ToArray())
?或者新字符串在引擎盖下就是这样做的?请注意,这种方法还允许您将标点替换为(例如)空格。用于标记化。C#没有Punct
类,但它有P