【问题标题】:How to split at every second quotation mark如何在第二个引号处拆分
【发布时间】:2014-04-28 21:11:45
【问题描述】:

我有一个看起来像这样的字符串

2,"E2002084700801601390870F"
3,"E2002084700801601390870F"
1,"E2002084700801601390870F"
4,"E2002084700801601390870F"
3,"E2002084700801601390870F"

这是一整串,你可以想象它在一行。

我想按照他们现在这样的方式来拆分它

2,"E2002084700801601390870F"

我无法更改它的格式。所以我最好的选择是每隔一个引号分割一次。但是我还没有找到任何好的方法来做到这一点。我试过这个https://stackoverflow.com/a/17892392/2914876 但我只收到关于无效争论的错误。

另一个问题是该项目运行的是 .NET 2.0,因此大多数 LINQ 功能不可用。

谢谢。

【问题讨论】:

  • 是否有换行符?
  • 为什么不用逗号分割然后两两重新组合字段呢?你对结果字符串做了什么?
  • 获取每个第二个引用的索引并在那里拆分。
  • 来源是什么?如果它是一个文件,你可以使用 ReadLines
  • 如果您的所有数据都是固定宽度,只需使用从零开始的索引。

标签: c# .net string split c#-2.0


【解决方案1】:

试试这个

var regEx = new Regex(@"\d+\,"".*?""");
var lines = regex.Matches(txt).OfType<Match>().Select(m => m.Value).ToArray();

在 .Net 2 上使用 foreach 而不是 LINQ Select

Regex regEx = new Regex(@"\d+\,"".*?""");
foreach(Match m in regex.Matches(txt))
{
    var curLine = m.Value;
}

【讨论】:

  • 您需要将.* 更改为.*?[^"]*,因为主题开头提到它是单行。
  • SelectToArray 在 .NET 2.0 中不可用
  • 添加了.net 2的版本
【解决方案2】:

我看到了三种可能性,没有一种特别令人兴奋。

  • 正如@dvnrrs 建议的那样,如果在换行符处没有逗号,那么您的状态应该很好。用新奇的东西替换,"。用你需要的替换剩余的"s。将“新事物”替换为," 以恢复它们。这可能是最可靠的——它解决了问题而没有太多的错误空间。

  • 遍历字符串,从上一个索引中寻找下一个"的索引,并维护一个状态机来决定是否对其进行操作。

  • 拆分"s 上的字符串,然后以最适合您的应用程序的方式重新加入它们。

【讨论】:

    【解决方案3】:

    我意识到正则表达式可以处理这个问题,但这里也有一个纯 2.0 的处理方式。在我看来,它更具可读性和可维护性。

    using System;
    using System.Collections.Generic;
    
    namespace ConsoleApplication1
    {
        internal class Program
        {
            private static void Main(string[] args)
            {
                const string data = @"2,""E2002084700801601390870F""3,""E2002084700801601390870F""1,""E2002084700801601390870F""4,""E2002084700801601390870F""3,""E2002084700801601390870F""";
    
                var parsedData = ParseData(data);
    
                foreach (var parsedDatum in parsedData)
                {
                    Console.WriteLine(parsedDatum);
                }
    
                Console.ReadLine();
            }
    
            private static IEnumerable<string> ParseData(string data)
            {
                var results = new List<string>();
                var split = data.Split(new [] {'"'}, StringSplitOptions.RemoveEmptyEntries);
    
                if (split.Length % 2 != 0)
                {
                    throw new Exception("Data Formatting Error");
                }
    
                for (var index = 0; index < split.Length / 2; index += 2)
                {
                    results.Add(string.Format(@"""{0}""{1}""", split[index], split[index + 1]));
                }
    
                return results;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-19
      • 1970-01-01
      • 2012-08-27
      • 2016-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多