Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从字符串中去掉标点符号?_C#_String - Fatal编程技术网

C# 如何从字符串中去掉标点符号?

C# 如何从字符串中去掉标点符号?,c#,string,C#,String,对于这个问题希望在30秒内得到答案的部分,我特别寻找C# 但在一般情况下,在任何语言中去除标点符号的最佳方法是什么 我应该补充:理想情况下,解决方案不需要您列举所有可能的标点符号 相关:最简单的方法是使用string.replace 另一种方法是使用regex.replace替换正则表达式,并在其中添加所有适当的标点符号。假设“最佳”表示“最简单”,我建议使用以下方法: String stripped = input.replaceAll("\\p{Punct}+", ""); string

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

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

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


相关:

最简单的方法是使用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字符类。简洁、精确、漂亮。为什么e
IEnumerable
到数组到字节到字符串的转换,为什么不干脆
新字符串(s.ToArray())
?或者新字符串在引擎盖下就是这样做的?请注意,这种方法还允许您将标点替换为(例如)空格。用于标记化。C#没有
Punct
类,但它有
P