【问题标题】:C#: Split comma-separated strings, but not if comma enclosed in single quotes [duplicate]C#:拆分逗号分隔的字符串,但如果逗号用单引号括起来则不[重复]
【发布时间】:2017-12-06 02:33:57
【问题描述】:

我正在从一些旧硬件解析一个文本文件,我需要从一个长字符串中提取一组字符串。

  • 元素以逗号分隔
  • 每个单独的字符串都用单引号括起来

'你好','世界'

{"'Hello', "'World'"}

出于任何其他原因的单引号是非法的,并且没有等效的转义字符;你不能写“Bob's”这个词,也不能写“Bob\'s”之类的东西。

通常可以很容易地通过逗号分割来获取单个元素:

string testString = "'Hello', 'World'";
ArrayList result = new ArrayList(testString.Split(',');

但我不能这样做;如果逗号在单引号之间,则它是 text,而不是分隔符。

这是一个元素:

“你好,世界”

{"'Hello, World'"}

如何提取元素以检查逗号是否在单引号之间?

'你好','世界','你好,世界'

{"'Hello'", "'World'", "'Hello, World'"}

更多细节:我无法保证元素之间的空白数量:

“你好”、    “世界”、“你好,世界”

附:这是我问 Swift 的同一个问题:Swift: Split comma-separated strings, but not if comma enclosed in single quotes

【问题讨论】:

  • 您考虑过使用正则表达式吗?
  • 谢谢。是的,我只是不擅长。
  • 改为使用''' 分割它,然后你得到的标记将在'' 包围的文本和中间的分隔符之间交替(由逗号和空格组成)
  • @MH175,只是做过滤,实际的标记将在交替索引,从 1 开始我相信因为第 0 个位置应该是第一个 ' 之前的无关文本。
  • @MH175,我刚刚阅读了您的 Swift 链接中的问题,这个想法与他的想法相似,您通过单引号进行标记,然后删除标记由单个逗号和空格组成。

标签: c# string


【解决方案1】:

您尚未回答字符串是否可以包含嵌入的单引号以及它们如何转义。

如果每个字符串都遵循[SingleQuote][Text][SingleQuote] 的模式,那么这里有一个正则表达式可以满足您的需求:

'[^']+'

如果单引号中有空字符串,请使用:

'[^']*'

【讨论】:

  • 感谢这项工作!如果你能展示完整的代码就好了。
  • 实际上我看到了一个问题:它在空字符串上给出了错误的结果
  • 空字符串会得到什么?
  • 我得到一个普通的逗号 ', '。
  • 用'Hello'、'World'、'Hello World'、''、''测试
【解决方案2】:

最简单的方法是使用Json deserialzer:

    private string[] F(string input){    
        return Newtonsoft.Json.
           JsonConvert.DeserializeObject("["+input+"]",typeof(string[]));
       }
// now call F:
var result= F("'Hello','World','Hello,World'");

【讨论】:

  • 有很多机会因为一些坏性格而失败。
【解决方案3】:

我尝试过这种方法,但我想知道这是否在大多数情况下都有效。

        const string str = "'Hello', 'World', 'Hello, World'";
        ArrayList arrStr = new ArrayList(str.Split('\''));
        List<string> myString = new List<string>();
        for (int i = 0 + 1; i < arrStr.Count; i+=2)
        {
            myString.Add(arrStr[i].ToString());
        }

另外,我不确定你的字符串是否有收缩。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-12
    • 2015-03-07
    • 1970-01-01
    • 2014-10-19
    • 2010-12-17
    • 2017-01-05
    • 2023-04-09
    相关资源
    最近更新 更多