對於這個問題希望有一個答案在30秒內的一部分,我特別尋找C#如何從字符串中去除標點符號?
但在一般情況下,什麼是最好的方式去除任何標點符號語言?
我應該加:理想情況下,解決方案不會要求您列舉所有可能的標點符號。
相關:Strip Punctuation in Python
對於這個問題希望有一個答案在30秒內的一部分,我特別尋找C#如何從字符串中去除標點符號?
但在一般情況下,什麼是最好的方式去除任何標點符號語言?
我應該加:理想情況下,解決方案不會要求您列舉所有可能的標點符號。
相關:Strip Punctuation in Python
這樣做將使用與string.replace
另一條路我會想象的最新空房禁地簡單的方法是regex.replace並與所有相應的標點符號有你的正則表達式標記在其中。
假設「最佳」的意思是「最簡單的」我建議使用這樣的事情:
String stripped = input.replaceAll("\\p{Punct}+", "");
這個例子是Java,但所有足夠現代的正則表達式引擎應該支持這個(或類似的東西)。
編輯:Unicode的版本會是這樣:
String stripped = input.replaceAll("\\p{P}+", "");
第一個版本僅僅着眼於包含在ASCII標點符號。
C#沒有`Punct`類,但它確實有'P` – JProgrammer 2017-12-17 21:28:45
new string(myCharCollection.Where(c => !char.IsPunctuation(c)).ToArray());
是的。它支持我在下面發佈的字符串操作。 – 2009-01-07 19:24:18
LinQ永遠不會驚歎我。 – Dermot 2012-07-28 02:57:13
輝煌。少即是多。 – 2013-08-21 08:08:15
可以使用regex.replace方法:
replace(YourString, RegularExpressionWithPunctuationMarks, Empty String)
由於該返回一個字符串,你的方法是這個樣子:
string s = Regex.Replace("Hello!?!?!?!", "[?!]", "");
您可以替換「[? !]「,如果你想要更復雜的東西:
(\p{P})
這應該找到任何標點符號。
基於關閉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; }));
下面是使用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();
正則表達式的使用通常比簡單字符運算慢。那些LINQ操作看起來對我來說太過於矯枉過正。而且你不能在.NET 2.0中使用這樣的代碼...
#include<string>
#include<cctype>
using namespace std;
int main(int a, char* b[]){
string strOne = "H,e.l/l!o W#[email protected]^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
描述意圖,最容易讀(恕我直言)和最佳表演:
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的算法是一堆表現最好的發佈。
$newstr=ereg_replace("[[:punct:]]",'',$oldstr);
這個線程太舊了,但我不想發佈一個更優雅的(IMO)解決方案。
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());
性能比使用字符串連接更好(雖然我同意這是不太直觀)。
我面臨同樣的問題,並擔心爲每個檢查調用IsPunctuation的性能影響。
我發現這個職位:http://www.dotnetperls.com/char-ispunctuation。
跨行: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())
不同的語言,其實是不同的,我不認爲你有問題的答案。你可以詢問特定的語言,或者哪種語言最適合這種操作。 – 2010-06-17 17:23:34