2013-10-21 193 views
2

我有了行類似這樣的CSV文件不同的是:正則表達式刪除各地逗號,空格時引述

1, 4,  2, "PUBLIC, JOHN Q" ,ACTIVE , 1332 

我要尋找一個正則表達式替換將匹配對這些行吐出類似的東西這樣的:

1,4,2,"PUBLIC, JOHN Q",ACTIVE,1332 

我想這將是相當容易:我做了表達([ \t]+,),取而代之。我用,替代(,[ \t]+)作爲補充表達式,我認爲我已經實現了修剪和左修剪字符串的好方法。

...但後來我發現我的"PUBLIC, JOHN Q"現在是"PUBLIC,JOHN Q"這不是我想要的。 (注意逗號後面的空格現在已經消失)。

什麼是適當的表達式來修剪逗號前後的空格,但保留引用的文本不變?

UPDATE

爲了澄清,我正在使用的應用程序來處理文件。這個應用程序允許我定義多個正則表達式替換;它不提供解析功能。雖然這可能不是這個理想的機制,但它肯定會爲這個文件創建另一個應用程序。

+6

你爲什麼不分析? –

+6

使用CSV解析器 - 不要嘗試重新發明輪子!查看[Microsoft.VisualBasic.FileIO.TextFieldParser](http://msdn.microsoft.com/zh-cn/library/microsoft.visualbasic.fileio.textfieldparser.aspx)。 – Tim

+0

我會解析文件並將其重新構建在一起。無需RegEx,我不好笑。 –

回答

2

如果您的工具使用的發動機是C#正則表達式引擎,那麼你可以嘗試下面的表達式:

(?<!,\s*"(?:[^\\"]|\\")*)\s+(?!(?:[^\\"]|\\")*"\s*,) 

更換空字符串。

這些傢伙的答案假設報價是平衡的,並用於計算確定空間是否是報價值的一部分。

我的表達式查找所有不屬於引用值的空格。

RegexHero Demo

+0

嗨@Sniffer什麼(?<!,是什麼意思?(我對正則表達式比較陌生,不知道<和!在組中的含義(?代表非捕獲組對)? – lucacerone

+0

@lucacerone它是自從我使用正則表達式以來,我已經有一段時間了,因此您需要檢查C#文檔以確保它正確,但是我記得這是一個負面的後顧之憂。 –

0
 string format(string val) 
     { 
      if (val.StartsWith("\"")) val = " " + val; 
      string[] vals = val.Split('\"'); 
      for (int i = 0; i < vals.Length; i += 2) vals[i] = vals[i].Replace(" ", "").Replace("\t", ""); 
      return string.Join("\t", vals); 
     } 

如果你有正確關閉在

1

之間有一些CSV去圖書館或分析文件自己會更容易,IMO應該在這裏最好選擇帶引號的字符串這將工作。

但如果你真的堅持一個正則表達式,你可以用這一個:

"\s+(?=([^\"]*\"[^\"]*\")*[^\"]*$)" 

並與空字符串代替它 - ""

此正則表達式的一個或多個空格匹配,其次是偶報價數量。只有當你有平衡的報價時,這當然會起作用。

(?x)  # Ignore Whitespace 
\s+  # One or more whitespace characters  
(?=  # Followed by 
    (   # A group - This group captures even number of quotes 
    [^\"]*  # Zero or more non-quote characters 
    \"   # A quote 
    [^\"]*  # Zero or more non-quote characters 
    \"   # A quote 
    )*   # Zero or more repetition of previous group 
    [^\"]*  # Zero or more non-quote characters 
    $   # Till the end 
)   # Look-ahead end 
1

像這樣的事情會做的工作:

(?<!(^[^"]*"[^"]*(("[^"]*){2})*))[\t ]*,[ \t]* 

它匹配[\t ]*,[ \t]*,只有當不被奇數引號的前面。

0

忘記正則表達式(參見問題Bart的評論,正則表達式是不適合CSV)。

public static string ReduceSpaces(string input) 
{ 
    char[] a = input.ToCharArray(); 
    int placeComma = 0, placeOther = 0; 
    bool inQuotes = false; 
    bool followedComma = true; 
    foreach(char c in a) { 
     inQuotes ^= (c == '\"'); 
     if (c == ' ') { 
      if (!followedComma) 
       a[placeOther++] = c; 
     } 
     else if (c == ',') { 
      a[placeComma++] = c; 
      placeOther = placeComma; 
      followedComma = true; 
     } 
     else { 
      a[placeOther++] = c; 
      placeComma = placeOther; 
      followedComma = false; 
     } 
    } 
    return new String(a, 0, placeComma); 
} 

演示:http://ideone.com/NEKm09

相關問題