2013-10-07 102 views
0

我創建了一個小控制檯程序,它將搜索文本文件並返回與用戶輸入的變量相匹配的所有字符串行。我碰到的一個問題是,比如我想查找代表位置代碼的「1234」,但是在字符串行中也有一個電話號碼爲「555-1234」,我也得到了一個。我想如果我輸入分隔符(例如:「,」)與變量(「,1234,」),那麼也許我可以確保搜索是準確的。我在正確的軌道上,還是有更好的方法?這是我到目前爲止:搜索字符串w /分隔符

string[] file = File.ReadAllLines(sPath); 
    foreach (string s in file) 
    { 
     using (StreamWriter sw = File.AppendText(rPath)) 
     { 
      if (sFound = Regex.IsMatch(s, string.Format(@"\b{0}\b", 
       Regex.Escape(searchVariable)))) 
      { 
       sw.WriteLine(s); 
      } 
     } 
    } 
+0

你有一個CSV文件? – Ryan

+0

大多數情況下它們都是csv文件,但有時我會遇到pipe或^分隔文件,所以也許我會讓用戶在開頭輸入分隔符。 – Mikem

+2

使用Linq轉爲CSV,讓您的生活更輕鬆。只需去Nuget並搜索Linq到CSV。 – jcwrequests

回答

0

我會說你是在正確的軌道上。

我建議改變正則表達式,以便它使用negative lookbehind來匹配前面沒有「 - 」的「searchVariable」,所以「555-1234」中的「1234」不匹配,而是「 ,1234「(例如)會。

如果你想在你的搜索中包含特殊的正則表達式字符,那麼你只需要使用"Regex.Escape()",這是你不想做的問題。

你可以更改代碼以這樣的(它晚了,所以我沒有測試過這個!)(!常棘手)

var lines= File.ReadAllLines(sPath); 
var regex = new Regex(String.Format("(?<!-){0}\b", searchVariable)); 

if (lines.Any()) 
{ 
using (var streamWriter = File.AppendText(rPath)) 
{  
    foreach (var line in lines) 
    { 
    if (regex.IsMatch(line)) 
    { 
    streamWriter.WriteLine(line); 
    } 
    } 
} 
} 

測試這些正則表達式一個偉大的網站是Regex Hero

+0

如何將用戶輸入變量與正則表達式變量合併? – Mikem

+0

@ user2836200我已經更新了正則表達式,所以現在包含了用戶輸入的變量。我也修改了正則表達式,以便「555-1234」中的「 - 」不會匹配,但是「,1234」(例如)會匹配。 –

+0

EEK!我忘了添加String.Format,這就是爲什麼添加變量不適合我的原因。我很欣賞反饋,但即使更新後的正則表達式也會導入附加字符串,如果它包含字符串行中的「,32541234」。我認爲如果我只能匹配分隔符之間的內容,那麼每次都是準確的。 – Mikem

0

使用Linq到CSV,讓您的生活更輕鬆。只需去Nuget並搜索Linq到CSV。

+0

我是新來編寫的代碼,所以我查了linq到CSV,但我不知道用它做任何事情。 – Mikem

+0

看看這個鏈接。 http://www.codeproject.com/Articles/25133/LINQ-to-CSV-library – jcwrequests

+0

會做,謝謝! – Mikem