【问题标题】:Regular Expression to split a string with comma and double quotes in c#正则表达式在c#中用逗号和双引号分割字符串
【发布时间】:2012-05-17 04:57:43
【问题描述】:

我尝试了一个正则表达式来用逗号和空格分割一个字符串。表达式匹配除一种以外的所有情况。我试过的代码是:

        List<string> strNewSplit = new List<string>();
        Regex csvSplit = new Regex("(?:^|,)(\"(?:[^\"]+|\"\")*\"|[^,]*)", RegexOptions.Compiled);
        foreach (Match match in csvSplit.Matches(input))
        {
            strNewSplit.Add(match.Value.TrimStart(','));
        }
        return strNewSplit;

案例1:“MYSQL,ORACLE”,“C#,ASP.NET”

预期输出:

“MYSQL,ORACLE”

“C#,ASP.NET”

结果:通过

CASE2:“MYSQL,ORACLE”、“C#,ASP.NET”

预期输出:

“MYSQL,ORACLE”

“C#,ASP.NET”

实际输出:

“MYSQL,ORACLE”

"C#

ASP.NET"

结果:失败。

如果我在两个 DoubleQuotes 之间的逗号后提供一个空格,那么我没有得到适当的输出。我错过了什么吗?请提供更好的解决方案。

【问题讨论】:

标签: c# regex string


【解决方案1】:

我通常会记下我的 Input 的 EBNF 以进行解析。

在你的情况下,我会说:

List = ListItem {Space* , Space* ListItem}*;

ListItem = """ 标识符 """; // 标识符就是一切"

空格 = [\t]+;

这意味着一个 List 由一个 ListItem 组成,该 ListItem 后面跟有零个或多个 (*) ListItem,这些 ListItem 用逗号隔开,然后是空格。

这将我引向以下内容(您正在搜索 ListItems):

static void Main(string[] args)
{
    matchRegex("\"MYSQL,ORACLE\",\"C#,ASP.NET\"").ForEach(Console.WriteLine);
    matchRegex("\"MYSQL,ORACLE\", \"C#,ASP.NET\"").ForEach(Console.WriteLine);
}
static List<string> matchRegex(string input)
{
    List<string> strNewSplit = new List<string>();
    Regex csvSplit = new Regex(
        "(\"(?:[^\"]*)\")"
        , RegexOptions.Compiled);
    foreach (Match match in csvSplit.Matches(input))
    {
       strNewSplit.Add(match.Value.TrimStart(','))
    }
    return strNewSplit;
}

返回你想要的。希望我理解正确。

【讨论】:

  • 感谢它运作良好。我已经添加了另一个 senario,如果我的输入像 C#,“asp.net,SQLSERVER”,那么我期望分别像 C# 和“asp.net,SQLSERVER”这样的输出。但您建议仅提供“asp.net,SQLSERVER”并省略 C#。感谢您一直以来的支持
  • 我正在寻找实际上用逗号和空格分割。如果字符串用双码括起来,那么应该像我的输入一样单独处理 C#、asp.net、“sqlserver,Linux java”,那么输出应该是 C#,然后是 asp.net,然后是“sqlserver,Linux java”。我希望我已经清楚地提到了我的问题
  • 正如我所说,尝试写下您输入的所有变体的 EBNF。如果您无法构建 ebnf,您可能无法一步完成正则表达式。您也可以用分号替换列表中“”中的所有逗号,然后您可以先用逗号分隔,然后再用分号。
猜你喜欢
  • 2017-11-25
  • 1970-01-01
  • 1970-01-01
  • 2013-05-19
  • 2019-01-14
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
相关资源
最近更新 更多