拆分字符串并验证每个部分

时间:2014-12-05 17:27:07

标签: c# winforms split

我有一个文件,其中包含管道分隔格式的内容。这是在WinForm应用程序的C#中。

完美格式示例:

1000|2014|01|AP|1|00000001|00
  • 第一个值应始终为4个长度。
  • 第二个值--4个长度。
  • 第3个值 - 2个长度。
  • 第4个值 - 2个长度。
  • 第5个值 - 1个长度。
  • 第6个值 - 8个长度。
  • 第7个值 - 2个长度。

收到的典型格式示例:

1000|2014|1|AP|1|1

请注意,典型格式不包含第7个值。在这些情况下,它应该默认为" 00"。其他字段也没有用前导零填充。这是我的方法。

//string buildcontentfromfile = the contents of each file that I receive and read
char[] delimiter = new char[] {'|'};
string[] contents = buildcontentfromfile.Split(delimiter);

if(contents[0].Length == 4)
{
   if(contents[1].Length == 4)
   {
      if(contents[2].Length == 2)
      {
         if(contents[3].Length == 2)
         {
            if(contents[4].Length == 1)
            {
               if(contents[5].Length == 8)
               {
                  if(contents[6].Length == 2)
                  {
                  }
               }
            }
         }
      }
   }
}

这将照顾"完美格式"当然,我需要添加更多逻辑来解决"典型格式"如何接收它们,比如检查第7个值,并将前导0添加到需要它们的字段中,以及长度。但我是否正确地接近这个?有一个更简单的过程来做到这一点?谢谢!

2 个答案:

答案 0 :(得分:2)

使用正则表达式:

var re = new Regex("\d{4}\|\d{4}\|\d\d\|\w\w\|\d\|\d{8}\|\d\d");
var valid = re.IsMatch(input);

答案 1 :(得分:2)

从我的头顶开始(我没有在实际的机器上试过这个)

var input = "1000|2014|01|AP|1|00000001|00";

var pattern = new int[] {4, 4, 2, 2, 1, 8, 2};

// Check each element length according to it's input position.
var matches = input
     .Split('|')
      // Get only those elements that satisfy the length condition.
     .Where((x, index) => x.Count() == pattern(index))
     .Count();

if (matches == pattern.Count())
    // Input was as expected.