2017-04-27 51 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:是的,你说得对,我的代码在这样的输入上会失败。这就是为什么我明确限制适用的情况。我只是想分享一个简单的在线解决方案,用于报价中不包含引号的情况。 –