2017-04-27 13 views
-2

だから私は非常に大きな問題を抱えている...C#の - 複雑な正規表現

私のような文字列を取得: "

'x,y',2,4,'y,z' 

そして私は

  • にそれを区切る必要がありますx、y '

  • 'Y、Z' 私が試した

何も事前にどこか期待された結果に近い...

感謝を来ませんでした!

+1

あなたのコードはどこですか? – Riad

+2

私はCSVパーサーを取得することをお勧めします。この種のことは正規表現で行うことができますが、それは価値がありません。 – juharr

+0

@juharr CSVパーサーはこれを行うことはできますか? – Azeros

答えて

2

あなたは迅速な解決を探しているなら、この(単純ループなし正規表現を)してみてください:

private static IEnumerable<string> CsvSplitter(string source) { 
    if (string.IsNullOrEmpty(source)) 
    yield break; //TODO: you may want to throw exception in case source == null 

    int lastIndex = 0; 
    bool inQuot = false; 

    for (int i = 0; i < source.Length; ++i) { 
    char c = source[i]; 

    if (inQuot) 
     inQuot = c != '\''; 
    else if (c == '\'') 
     inQuot = true; 
    else if (c == ',') { 
     yield return source.Substring(lastIndex, i - lastIndex); 

     lastIndex = i + 1; 
    } 
    } 

    //TODO: you can well have invalid csv (unterminated quotation): 
    // if (inQuot) 
    // throw new FormatException("Incorrect CSV"); 

    yield return source.Substring(lastIndex); 
} 

サンプル:

string source = @"'x,y',2,4,'y,z',"; 
string[] result = CsvSplitter(source).ToArray(); 

Console.Write(string.Join(Environment.NewLine, result)); 

出力:

'x,y' 
2 
4 
'y,z' 

しかし、一般的なケースでCSVパーサーのグーグル

+0

ありがとう! Спасибо – Azeros

+0

@Azeros:あなたはようこそ! –

2

あなたが正規表現の道を行きたいならば、あなたは

('.*?'|[^,]+) 

を使用してキャプチャグループを閲覧し、私は強くはあなたをお勧めしますすることができますCSVパーサーを使用する。

+1

引用符( '' 'の場合)をデータに含めるには難しいでしょう。 CSVの場合、通常は引用符を二重引用符で囲みます。例えば、 '' 'x' 'y'、2,4、 'y、z' ''は' [' x '、' y '、2 、4、 'y、z'] 'である。だからこそ*正規表現*は部分的な解決策であると思われ、私はあなたの強い思い出に完全に同意します。 –

1

ネストされた引用符が許可されていない場合は、我々は簡単な正規表現'.*?'|[^,]+で必要な部品を取り出すことができます。

var input = "'x,y',2,4,'y,z'"; 

var parts = Regex 
    .Matches(input, "'.*?'|[^,]+") 
    .Cast<Match>() 
    .Select(m => m.Value) 
    .ToList(); 

Console.WriteLine(string.Join(Environment.NewLine, parts)); 

デモ:https://dotnetfiddle.net/qo5aHz

.NET味がネストされた引用符のための正規表現を詳しく説明することができますが、かなり難しいでしょう。したがって、既製のCSVパーサーを使用するのが最善です。たとえば、.NETで提供されるTextFieldParserなどです。

+0

ちょっと変わった*カウンターの例*:CSVで*ダブルクォート記号を含める場合は '' 'x'、 'y'、2,4、 'y、z' ''は' ['x'、 'y'、2、4、 'y、z'] ' –

+0

@DmitryBychenko:はい、そうです。だからこそ私はこれが当てはまる場合を明示的に制限したのです。私は引用符の中に引用符がない場合のための簡単なオンラインソリューションを共有したかっただけです。 –