2015-05-13 53 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