2013-12-19 39 views
3

以外的字符我在數據表中有大量的字符串數據,我想刪除<NIS/>,<NONNATIVE/>和空格以外的字符。例如,刪除除<NIS/>,<NONNATIVE/>和空格

之前:" There are<NONNATIVE/> not<NIS/> <NIS/> correct"

後:" <NONNATIVE/> <NIS/> <NIS/> "

由於數據量很大,我想找一個快速的方法來處理它,任何人都可以幫助我嗎?

回答

1

你可以做這樣的事情,我想

var before = " There are<NONNATIVE/> not<NIS/> <NIS/> correct"; 
var after = new StringBuilder(); 

Regex.Replace(before, @"(|<NONNATIVE\/>|<NIS\/>)", m => 
{ 
    after.Append(m.Value); 
    return ""; 
}); 

它會抓住你要接受並添加一個StringBuilder這些東西,那麼你就必須把它轉換ToString

// <NONNATIVE/> <NIS/> <NIS/> 
after.ToString(); 
+1

謝謝!這種方法每個數據成本爲0.0005s。 –

0

不關於性能肯定,但這也將工作:

string input1 = " There are<NONNATIVE/> not<NIS/> <NIS/> correct"; 
string[] approvedlist = {"<NONNATIVE/>","<NIS/>"}; 
string output1 = string.Join(" ", (from s in input1.Split(@"<>".ToCharArray()) 
              where approvedlist.Contains(s) 
              select "<" + s + ">").ToArray()); 

我做了一個性能測試,這與Bruno的例子相差無幾,這個例子對於超過100000個字符的字符串,要隨機插入每5-20個字符的字符串。

做了一些優化,並考慮到您的進一步的評論和與此想出了:

 string[] approvedlist = {"<NONNATIVE/>","<NIS/>"}; 
     var output2 = new StringBuilder(); 
     foreach(string s in input1.Split(@"<>".ToCharArray())) 
      if(approvedlist.Contains(s)) 
       output2.AppendFormat("<{0}> ", s); 

在我的測試中表現優於這一切迄今。

+0

謝謝!可能linq的成本很高,這種方式花費我每個數據0.03s。 –

+0

我注意到這種方法和正則表達式方法之間的一件事。這會在要返回的每個元素之間留出空間。而正則表達式之間只有一些空間。我也想看看你是如何測試這個我得到完全不同的結果。 – tinstaafl

+0

我的測試字符串不像您使用的那麼長,並且還有一些其他標籤,如「」,這些標籤也應該刪除。 –

1

您可以使用以下內容。

string input = " There are<NONNATIVE/> not<NIS/> <NIS/> correct"; 
string output = Regex.Replace(input, @"((?> |<NIS\/>|<NONNATIVE\/>)*)\S?", "$1"); 

// " <NONNATIVE/> <NIS/> <NIS/> " 

Live demo

+0

非常感謝,這種方式花費我每個數據0.0001s! –