2015-05-13 97 views
2

示例文本:(約翰,36歲,阿拉巴馬州)嚴格的方式

我在做什麼我的代碼中首先匹配的圓括號()內,然後使用拆分內容一個逗號作爲分隔符。

private static IEnumerable<string> GetValues(string value) 
{ 
    var matches = Regex.Matches(value, @"\(.*\)"); 
    if (matches.Count == 0) return new string[0]; 

    var valueSplit = matches[0].Value; 
    var theString = valueSplit.Trim('(', ')'); 
    var wordSplit = theString.Split(',').Select(x=>x.Trim()); 
    return wordSplit; 
} 

對於樣品文本(約翰,36,阿拉巴馬州)上述代碼返回:

  • 約翰
  • 阿拉巴馬

現在的問題是我該如何爲逗號創建一個轉義序列,並將其用作分隔符。

,使得用於樣本文本(約翰36,奧爾頓,這逗號阿拉巴馬之前< -something)返回

  • 約翰
  • 奧爾頓,阿拉巴馬

並遞歸地讓我甚至可以逃避轉義序列本身?我已經試過我的頭周圍與string.replaceRegex.Replace但無濟於事。

繼承人Fiddle

+1

如果您知道,只有一個字段可以包含逗號(,它是放在最後),那麼你可以限制分割的數量預期字段數。 – nhahtdh

+0

兩個想法。首先,應對此(CSV樣式)的一種方法是將包含分隔符的字段用引號括起來,以便引號中包含的任何逗號不是分隔符。處理這個問題的另一種方法是選擇一個不是逗號的分隔符。逗號實際上不是一個很好的分隔符。你可以選擇一個不同的分隔符,比如'|'嗎? – DWright

+0

@DWright我完全同意逗號不是最好的分隔符,但不幸的是我無法對當前的設置進行任何更改。除了找到逃避分隔符的方法。 – AmatuerDev

回答

0

如果您只想3子,那麼你可以限制來自分流

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text.RegularExpressions; 

public class Program 
{ 
    public static void Main() 
    { 
     foreach (var item in GetValues("(John, 36, Alabama, Whatever, Manager)")) 
     { 
      Console.WriteLine(item); 
     } 
    } 

    private static IEnumerable<string> GetValues(string value) 
    { 
     var matches = Regex.Matches(value, @"\(.*\)"); 
     if (matches.Count == 0) return new string[0]; 

     var valueSplit = matches[0].Value; 
     var theString = valueSplit.Trim('(', ')'); 
     var wordSplit = theString.Split(new char[]{','}, 3, StringSplitOptions.None).Select(x=>x.Trim()); 
     return wordSplit; 
    } 
} 

輸出:

  • 約翰
  • 阿拉巴馬,無論如何,經理

這裏是Fiddle

+0

不幸的是,這不是擺脫分隔符的正確方法,至少在我的情況下,因爲可以有3個以上的值。 – AmatuerDev

+0

你看過小提琴的鏈接嗎?有了這個,你可以擁有儘可能多的你想要的,但只有前兩個將分開,其他所有內容將在第三個分割中(包括你的分隔符) – pastacool